[洛谷P1638]逛画展

[洛谷P1638]逛画展

题目大意:

\(n(n\le10^6)\)个格子,每个格子有一种颜色。颜色种数为\(m(m\le2000)\)。求包含所有颜色的最小区间。

思路:

尺取法裸题。

思路:

#include<cstdio>
#include<cctype>
#include<climits>
inline int getint() {
	register char ch;
	while(!isdigit(ch=getchar()));
	register int x=ch^'0';
	while(isdigit(ch=getchar())) x=(((x<<2)+x)<<1)+(ch^'0');
	return x;
}
const int N=1e6+1,M=2001;
int a[N],cnt[M],tot;
int main() {
	const int n=getint(),m=getint();
	for(register int i=1;i<=n;i++) {
		a[i]=getint();
	}
	int min=INT_MAX,b,e;
	for(register int l=1,r=0;l<=n;l++) {
		for(;tot<m&&r<n;) {
			if(!cnt[a[++r]]++) tot++;
		}
		if(tot==m) {
			if(r-l+1<min) {
				min=r-l+1;
				b=INT_MAX;
			}
			if(r-l+1==min&&l<b) {
				b=l,e=r;
			}
		}
		if(!--cnt[a[l]]) tot--;
 	}
 	printf("%d %d\n",b,e);
	return 0;
}
posted @ 2018-10-29 13:33  skylee03  阅读(197)  评论(0编辑  收藏  举报