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 }
原文地址:https://www.cnblogs.com/sasuke-/p/5133471.html