首页 > 其他 > 详细

codeforces 616D

时间:2016-01-15 16:25:25      阅读:186      评论:0      收藏:0      [点我收藏+]

题意:给你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 }

 

codeforces 616D

原文:http://www.cnblogs.com/sasuke-/p/5133471.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!