题目大意:
给你长度为N的一个序列,让你找到一个最长的连续子序列,使得其中元素的种类数不超过K个。
思路:
很裸的尺取法的问题啊。
我萌维护一个窗口,使得窗口一直保证是一个连续合法子序列,过程维护一个最长就行啊。
Ac代码:
#include<stdio.h>
#include<string.h>
#include<map>
using namespace std;
int a[505000];
int main()
{
int n,k;
while(~scanf("%d%d",&n,&k))
{
for(int i=0;i<n;i++)scanf("%d",&a[i]);
int sum=0;
int l=0;
int r=0;
int L,R;
int output=0;
map<int ,int >s;
while(r<n)
{
s[a[r]]++;
if(s[a[r]]==1)sum++;
if(sum<=k)
{
if(r-l+1>output)
{
L=l,R=r;
output=r-l+1;
}
}
if(sum==k)
{
while(r+1<n)
{
if(s[a[r+1]]==0)break;
else s[a[r+1]]++,r++;
if(r-l+1>output)
{
L=l,R=r;
output=r-l+1;
}
}
while(l<=r&&sum==k)
{
s[a[l]]--;
if(s[a[l]]==0)sum--;
l++;
}
}
r++;
}
printf("%d %d\n",L+1,R+1);
// printf("%d\n",output);
}
}