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

codeforces_616D. Longest k-Good Segment(尺取法)

2016-03-25 16:11 267 查看
D. Longest k-Good Segmenttime limit per test1 secondmemory limit per test256 megabytesinputstandard inputoutputstandard outputThe array a with n integersis given. Let's call the sequence of one or more consecutive elements in a segment.Also let's call the segment k-good if it contains no more than k differentvalues.Find any longest k-good segment.As the input/output can reach huge size it is recommended to use fast input/output methods: for example, prefer to use scanf/printfinstead of cin/cout inC++, prefer to use BufferedReader/PrintWriter instead of Scanner/System.out in Java.InputThe first line contains two integers n, k (1 ≤ k ≤ n ≤ 5·105)— the number of elements in a and the parameter k.The second line contains n integers ai (0 ≤ ai ≤ 106)— the elements of the array a.OutputPrint two integers l, r (1 ≤ l ≤ r ≤ n)— the index of the left and the index of the right ends of some k-good longest segment. If there are several longest segments you can print any of them. The elements in a arenumbered from 1 to n fromleft to right.Examplesinput
5 5
1 2 3 4 5
output
1 5
input
9 3
6 5 1 2 3 2 1 4 5
output
3 7
input
3 1
1 2 3
106b4
output
1 1
尺取法,这里有尺取法的说明,很详细。
#include <iostream>#include <cstdio>#include <cstdlib>#include <cstring>#include <cmath>using namespace std;int a[500010];int v[1000010];int main(){int i,j,n,k;memset(v,0,sizeof(v));scanf("%d%d",&n,&k);for(i=1;i<=n;i++){scanf("%d",&a[i]);}int pi=1,pj=1,num=0,ansi=1,ansj=1;for(pj=1;pj<=n;pj++){v[a[pj]]++;if(v[a[pj]]==1)num++;while(num>k){v[a[pi]]--;if(v[a[pi]]==0)num--;pi++;}if(pj-pi+1>ansj-ansi+1){ansi=pi;ansj=pj;}}printf("%d %d\n",ansi,ansj);return 0;}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: