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 - 616D

CodeForces 5C Longest Regular Backet sequence

CodeForces - 5C Longest Regular Bracket Sequence

CodeForces 632D Longest Subsequence

Codeforces-5C. Longest Regular Bracket Sequence

Codeforces 1304B. Longest Palindrome