原题链接:http://codeforces.com/contest/616/problem/D
好久没做codeforces了。。。
题意长度为n的数组中找存在最多k个不同数字的最长序列的左右端点。
没找着技巧,不过一开始我是从第一个开始找的,初始化左右端点为1,然后改变向右延伸的长度,这样在延伸的过程中长度不满足之后就右移左端点,然后记录最长序列。。
但是我犯了一个错误,就是在右移左端点时,可能右移之后还是不满足,就要循环一直移动,直到满足为止。。。看了题解恍然大悟(蠢到家了)
代码:
#include <cstdio>
using namespace std;
int a[500005];
int cnt[1000005];
int main()
{
int i, j, n, k, c = 0;
scanf("%d%d", &n, &k);
for (i = 1; i <= n; i++)
scanf("%d", &a[i]);
int u = 1, v = 1, pu = 1, pv = 1;
for (v = 1; v <= n; v++)
{
cnt[a[v]]++;
if (cnt[a[v]] == 1)
c++;
while (c > k)
{
cnt[a[u]]--;
if (cnt[a[u]] == 0)
c--;
u++;
}
if (v - u > pv - pu)
{
pu = u;
pv = v;
}
}
printf("%d %d\n", pu, pv);
return 0;
}