CodeForces 602 B.Approximating a Constant Range(尺取+set)

来源:互联网 发布:狄俄尼索斯知乎 编辑:程序博客网 时间:2024/06/04 01:10

Description
给出一个长度为n的序列a[i],保证任意两个相邻的数差值不超过1,问该序列中极差不超过1的最长子段长度
Input
第一行一整数n表示序列长度,之后n个整数a[i]表示该序列(2<=n<=1e5,1<=a[i]<=1e5)
Output
输出极差不超过1的最长子段长度
Sample Input
5
1 2 3 3 2
Sample Output
4
Solution
尺取,用set维护区间最大值和最小值,极差不超过1则更新答案然后区间右端点右移,否则左端点右移,时间复杂度O(nlogn)
Code

#include<cstdio>#include<iostream>#include<cstring>#include<algorithm>#include<cmath>#include<vector>#include<queue>#include<map>#include<set>#include<ctime>using namespace std;typedef long long ll;#define INF 0x3f3f3f3f#define maxn 111111int n,a[maxn];multiset<int>s;multiset<int>::iterator it;int main(){    while(~scanf("%d",&n))    {        s.clear();        for(int i=1;i<=n;i++)scanf("%d",&a[i]);        s.insert(a[1]);        int l=1,r=2,m,M,ans=1;        while(l<=n)        {            it=s.end();            it--;             m=*s.begin(),M=*it;            if(M-m>1)            {                it=s.find(a[l]);                s.erase(it),l++;            }            else            {                ans=max(ans,r-l);                if(r<=n)                {                    s.insert(a[r]),r++;                }                else break;            }        }        printf("%d\n",ans);    }    return 0;}
0 0