codeforces 616D
题意:给你n个数,找出一个最大的区间,满足:不同的数值个数不超过k;
//我开始又看错题了、 以为是找出一个最大区间,里面的数的最大值不超过k;
思路:利用一个窗口滑动,左端点表示当前位置,右端点表示目前这段数列符合要求, 每增加一个长度,判断是否合理,不然平移左端点。 思路来自:http://blog.csdn.net/u011528035/article/details/50521870#;
1 #include<cstdio> 2 #include<iostream> 3 #include<cmath> 4 using namespace std; 5 const int qq=1e6; 6 int num[qq]; 7 int dp[qq]; 8 int l,r,k,n,ans,dif,p,q; //定义的全局变量自动初始化为0(包括数组). 9 int main() 10 { 11 cin >> n >> k; 12 l=r=1; 13 for(int i=1;i<=n;++i){ 14 cin >> num[i]; 15 if(!dp[num[i]]) ++dif; 16 dp[num[i]]++; 17 r=i; 18 if(dif>k){ 19 for(int j=l;j<=r;++j){ 20 dp[num[j]]--; 21 if(!dp[num[j]]){ 22 dif--;l=j+1;break; 23 } 24 } 25 } 26 if(r-l+1>ans){ 27 ans=r-l+1;q=l;p=r; 28 } 29 } 30 cout << q << " " << p << endl; 31 }