码迷,mamicode.com
首页 > 移动开发 > 详细

Approximating a Constant Range

时间:2016-06-07 23:54:34      阅读:210      评论:0      收藏:0      [点我收藏+]

标签:

原题地址:http://codeforces.com/contest/602/problem/B

 

题意
给定一个序列,满足abs(a[i+1]-a[i])<=1
要求找到最长的一个子序列[l,r]满足序列中最大值max和最小值之差小于等于1

题解
要求找到题意要求的最长序列,对应的序列有什么特征呢?
假如序列起点终点是l,r,那么应该有abs(A[l-1]-A[r])==2
所以我们枚举终点,对应的起点可以用一个p数组O(1)维护和查询
同时,要求这个序列中A[r]-1和A[r]+1不能同时出现,也可以用p数组实现判断

p[x]:x出现的最后位置
也就是上一个x出现的下标
有的时候因为x过大的缘故,需要离散化或者用map代替数组实现这一功能

 

#include<bits/stdc++.h>

using namespace std;
const int maxn=1e5;

int p[maxn+10];
int arr[maxn+5];

int main(void)
{
    #ifdef ex1
    freopen ("in.txt","r",stdin);
    #endif
    
    int n;
    scanf("%d",&n);
    
    for (int i=1;i<=n;++i)
    {
        scanf("%d",&arr[i]);
    }
    
    int ans=0;
    for (int i=1;i<=n;++i)
    {
        int x=arr[i];
        p[x+2]=i;
        
        int k=max(p[x+4],p[x]);
        if (p[x+3]>k && p[x+1]>k)
        {
            ans=max(ans,i-min(p[x+3],p[x+1]));
        }
        else
        {
            ans=max(ans,i-k);
        }
    }
    
    printf("%d\n",ans);
    
} 

 

Approximating a Constant Range

标签:

原文地址:http://www.cnblogs.com/123-123/p/5568525.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!