题目链接:http://codeforces.com/problemset/problem/616/D
题意: 给出一个序列,要求找出一个最大连续的子序列,要求子序列中不同的数不可以超过k
思路:因为是连续的序列,所以可以用"尺取法"(听别人说的名字),类似于维护一个符合题目要求的队列,这个方法似乎经常用到的,详细看代码
#include <iostream>
#include <cstdio>
#include <iostream>
#include <cstring>
using namespace std;
int s[500030],vis[1000030];
int main()
{
int n,m;
while (scanf("%d%d",&n,&m)!=EOF)
{
for (int i=0;i<n;i++)
scanf("%d",&s[i]);
memset(vis,0,sizeof(vis));
int pos=0,maxx=0,ansl=0,ansr=0,num=0;
for (int i=0;i<n;i++)
{
if (vis[s[i]]==0)
num++;
vis[s[i]]++;
while (num>m)
{
vis[s[pos]]--;
if (vis[s[pos]]==0) num--;
pos++;
}
if (maxx<i-pos+1)
{
maxx=i-pos+1;
ansl=pos;
ansr=i;
}
}
printf("%d %d\n",ansl+1,ansr+1);
}
}