Use the queue to maintain a bit
#include <cstdio>#include<cstring>#include<queue>#include<algorithm>using namespacestd;Const intmaxn=500000+Ten;intn,k;intA[MAXN];inttot[1000000+Ten];structnode{intID; intVal;} Node[maxn];queue<Node>Q;intMain () {scanf ("%d%d",&n,&k); for(intI=1; i<=n; i++) {scanf ("%d",&A[i]); Node[i].id=i; Node[i].val=A[i]; } memset (Tot,0,sizeoftot); intans=0, ANSL,ANSR; intnow=0; for(intI=1; i<=n; i++) {Q.push (node[i]); if(tot[node[i].val]==0) now++; Tot[node[i].val]++; if(now<=k) {Node head=Q.front (); if(node[i].id-head.id+1>ans) {ans=node[i].id-head.id+1; Ansl=head.id; ANSR=node[i].id; } } Else if(now>k) { while(1) {Node head=Q.front (); if(tot[head.val]==1) now--; Tot[head.val]--; Q.pop (); if(now==k) Break; } Node head=Q.front (); if(node[i].id-head.id+1>ans) {ans=node[i].id-head.id+1; Ansl=head.id; ANSR=node[i].id; }}} printf ("%d%d\n", ANSL,ANSR); return 0;}
Codeforces 616D Longest K-good Segment