求助
查看原帖
求助
220362
chenxuanting楼主2020/10/31 19:25
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
typedef unsigned long long ll;
int n,m;
int a[1000005];
int b[2005];
int l=1,r=1;
int minl,minr,minmoney=1e9;
bool check()
{
	if(r-l+1<m){
		return 0;
	}
	int tf=1;
	for(int i=1;i<=m;i++){
		if(b[i]==0){
			tf=0;
			break;
		}
	}
	return tf;
}
void read(int &x)
{
	int fh=1;
	char s;
	x=0;
	s=getchar();
	if(s<'0'||s>'9'){
		if(s=='-'){
			fh=-1;
		} 
	}else{
		x=int(s-'0');
	}
	while(s=getchar()){
		if(s>='0'&&s<='9'){
			x*=10;
			x+=(int)(s-'0');
		}else{
			break;
		}
	}
	x*=fh;
}
int main()
{
	read(n);//快读 
	read(m);
	for(int i=1;i<=n;i++){
		read(a[i]);
	}
	for(r=1;r<=n;r++){//考虑以r为结尾的若干张画 
		if(l==r||a[l]!=a[r]){
			b[a[r]]++;//无替换,这个名师的画的个数+1 
		} 
		while(l!=r&&a[l]==a[r]){
			l++;//出现了这个名师的画,那么之前的就可以替换掉了 
		}
		if(check()==1){//如果m个名师的画都有 
			if(r-l+1<minmoney){//如果长度小于以前 
				minl=l;//赋值 
				minr=r;
				minmoney=r-l+1;
				b[a[l++]]--;//b[a[l]]--,l++;
				//如果后面仍以这个l为开头,则不可能比现在的minmoney少 
			}
		}
	}
	printf("%d %d",minl,minr);
    return 0;
}

2020/10/31 19:25
加载中...