传送门:http://codeforces.com/problemset/problem/616/D
对于给定的n个数的数列a,第k好的区间是一个区间中不同的数的个数不超过k,求一个最大长度的区间
尺取法,还是扫描整个区间,如果当前的种类已经超过k了就让左端指针后移直到种类<=k为止
代码如下:
#include<cstdio>
using namespace std;
int n,k;
int s[500050];
int d[1000005];
int sum=0;
int ansl,ansr;
int main()
{
scanf("%d%d",&n,&k);
for (int i=1;i<=n;i++)
{
scanf("%d",&s[i]);
}
int l=1;
int r=0;
ansl=0;
ansr=0;
for (int i=1;i<=n;i++)
{
r++;
if (!d[s[r]])
{
sum++;
}
d[s[r]]++;
while (sum>k)
{
d[s[l]]--;
if (!d[s[l]])
{
sum--;
}
l++;
}
if (ansr-ansl<=r-l)
{
ansl=l;
ansr=r;
}
}
printf("%d %d\n",ansl,ansr);
return 0;
}