CodeForces - 616D Longest k-Good Segment
Posted Jozky86
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CodeForces - 616D Longest k-Good Segment相关的知识,希望对你有一定的参考价值。
CodeForces - 616D Longest k-Good Segment
题意:
有包含n个数的序列a,求能找到最长的区间包含不超过k个不同的元素。
题解:
尺取法,先固定L,然后移动R,R每次移动,当超过k后,L再移动
代码:
#include<bits/stdc++.h>
#define debug(a,b) printf("%s = %d\\n",a,b);
typedef long long ll;
using namespace std;
inline int read(){
int s=0,w=1;
char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();//s=(s<<3)+(s<<1)+(ch^48);
return s*w;
}
const int maxn=5e5+9;
int a[maxn];
int q[maxn];
int iff[10000009];
int L,R;
int main()
{
int n,k;
n=read();
k=read();
for(int i=1;i<=n;i++)scanf("%d",&a[i]);
int l=1,r=1;
L=1,R=1;
int maxx=0;
int tot=1;
iff[a[1]]=1;
while(l<=r&&r<=n){
while(tot<=k&&r<n)
{
r++;
if(iff[a[r]]==0){
tot++;
iff[a[r]]++;
if(tot>k)break;
if((r-l)>(R-L))
{
L=l;
R=r;
}
}
else
{
iff[a[r]]++;
if(tot>k)break;
if((r-l)>(R-L))
{
L=l;
R=r;
}
}
}
iff[a[l]]--;
if(iff[a[l]]==0)tot--;
l++;
}
cout<<L<<" "<<R<<endl;
}
以上是关于CodeForces - 616D Longest k-Good Segment的主要内容,如果未能解决你的问题,请参考以下文章
CodeForces 5C Longest Regular Backet sequence
CodeForces - 5C Longest Regular Bracket Sequence
CodeForces 632D Longest Subsequence