【CodeForces 616D】Longest k-Good Segment
题意
n个数里,找到最长的一个连续序列使里面最多k个不同的数。
分析
尺取法,每次R++,如果第R个数未出现过,那么不同的数+1,然后这个数的出现次数+1,如果不同的数大于k了,那就要去掉第L个数,直到不同的数为k,然后更新答案。
代码
#include<cstdio> #define ll long long #define N 500005 int n,k; int a[500005],num[1000005]; int l,r; int s,ansl,ansr; int main() { scanf("%d%d",&n,&k); for(int i=1; i<=n; i++) { scanf("%d",&a[i]); } ansl=1; ansr=k; l=1; r=0; while(r<n) { r++; if(num[a[r]]==0)s++; num[a[r]]++; while(s>k) { num[a[l]]--; if(num[a[l]]==0)s--; l++; } if(r-l>ansr-ansl) { ansr=r; ansl=l; } } printf("%d %d",ansl,ansr); return 0; }
┆凉┆暖┆降┆等┆幸┆我┆我┆里┆将┆ ┆可┆有┆谦┆戮┆那┆ ┆大┆始┆ ┆然┆
┆薄┆一┆临┆你┆的┆还┆没┆ ┆来┆ ┆是┆来┆逊┆没┆些┆ ┆雁┆终┆ ┆而┆
┆ ┆暖┆ ┆如┆地┆站┆有┆ ┆也┆ ┆我┆ ┆的┆有┆精┆ ┆也┆没┆ ┆你┆
┆ ┆这┆ ┆试┆方┆在┆逃┆ ┆会┆ ┆在┆ ┆清┆来┆准┆ ┆没┆有┆ ┆没┆
┆ ┆生┆ ┆探┆ ┆最┆避┆ ┆在┆ ┆这┆ ┆晨┆ ┆的┆ ┆有┆来┆ ┆有┆
┆ ┆之┆ ┆般┆ ┆不┆ ┆ ┆这┆ ┆里┆ ┆没┆ ┆杀┆ ┆来┆ ┆ ┆来┆