您的位置:首页 > 编程语言 > Go语言

Codeforces 616 D. Longest k-Good Segment

2016-01-14 22:28 651 查看
传送门:http://codeforces.com/problemset/problem/616/D

Two Pointers

大概思想为:区间中为每一个l,找一个最远的r使得满足条件,一般思想都为,如果对应于l的为r,则对应于l+1的必为r+1以后的值,因为这以内的值必定都满足题意,因此复杂度就为O(2*n)了!!

此题打的时候马虎点:

首先是区间左右端点初值的赋值,应该为1,

然后是左端点一定要有赋值,即l=1;

然后是每个点的计数器,每扫一次都应该加1,而不是说没出现的时候再+1,这实在是不小心了!!

[code]#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn=5e5+10;
int vis[(int)1e6+10];
int a[maxn];
int n,k,l,r;int maxl,maxr;
int main(){
    scanf("%d%d",&n,&k);
    int cur=1;
    maxl=1;maxr=1;
    for(int i=1;i<=n;i++){
        scanf("%d",&a[i]);
    }
    int l=1;vis[a[1]]=1;
    int maxlen=0;
    for(int r=2;r<=n;r++){
        if(!vis[a[r]]){
            cur++;
        }
        vis[a[r]]++;
        if(cur>k){
            while(vis[a[l]]>0){
                vis[a[l]]--;
                if(vis[a[l]]==0){
                    cur--;l++;break;
                }
                l++;
            }
        }
        if(r-l>maxlen){
            maxlen=r-l;maxl=l;maxr=r;
        }
    }
    printf("%d %d\n",maxl,maxr);
    return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: