CodeForces 616 D. Longest k-Good Segment(尺取)
2016-02-26 16:32
561 查看
Description
给出一个长度为n的序列,如果这个序列的某一个子段含有不超过k个不同的数字则称这个子段是第k好的子段,问这个序列最长的第k好子段的起始位置和结束位置
Input
第一行为两个整数n和k,之后为n个整数ai表示该序列(1<=k<=n<=5*10^5,0<=ai<=10^6)
Output
这个序列最长的第k好子段的起始位置和终止位置
Sample Input
9 3
6 5 1 2 3 2 1 4 5
Sample Output
3 7
Solution
尺取,记录[l,r]中不同数的个数,每次这个数小于k那么r++,如果已经大于k则l++直到个数不大于k,每次更新完r之后判断r-l+1是否比已有答案更优来更新答案即可
Code
给出一个长度为n的序列,如果这个序列的某一个子段含有不超过k个不同的数字则称这个子段是第k好的子段,问这个序列最长的第k好子段的起始位置和结束位置
Input
第一行为两个整数n和k,之后为n个整数ai表示该序列(1<=k<=n<=5*10^5,0<=ai<=10^6)
Output
这个序列最长的第k好子段的起始位置和终止位置
Sample Input
9 3
6 5 1 2 3 2 1 4 5
Sample Output
3 7
Solution
尺取,记录[l,r]中不同数的个数,每次这个数小于k那么r++,如果已经大于k则l++直到个数不大于k,每次更新完r之后判断r-l+1是否比已有答案更优来更新答案即可
Code
#include<cstdio> #include<iostream> #include<cstring> using namespace std; #define maxn 555555 int n,k,cnt,a[maxn],flag[2*maxn]; int main() { while(~scanf("%d%d",&n,&k)) { memset(flag,0,sizeof(flag));cnt=0; for(int i=1;i<=n;i++) { scanf("%d",&a[i]); if(i<=k) { if(!flag[a[i]])cnt++,flag[a[i]]=1; else flag[a[i]]++; } } int l=1,r=k,ansl=1,ansr=k; while(r<n) { if(flag[a[r+1]]||cnt<k) { r++; if(flag[a[r]]==0)cnt++; flag[a[r]]++; if(ansr-ansl<r-l)ansl=l,ansr=r; } else { if(flag[a[l]]==1)cnt--; flag[a[l]]--; l++; } } printf("%d %d\n",ansl,ansr); } return 0; }
相关文章推荐
- django使用rest_framework
- django book的第一个例子
- Altium Designer AD6 AD9 DXP 制作公司LOGO终极大招,大小随意放置
- golang strconv
- 【转载】Google Analytics 使用图文全攻略
- gomobile 真机 log 打出的日志跟踪
- 原创翻译:James Whittaker系列——Google是如何测试的(3)
- 用goto语句 百钱百鸡。公鸡5元一只,母鸡3元一只,小鸡1元3只。求100元分别能买多少公鸡、母鸡、小鸡。
- golang实现抽象工厂模式
- Django开发常用的模块
- UVA 1623(p256)----Enter the Dragon
- golang实现常用排序算法
- UVa Dragon of Loowater 11292 (贪心)
- 关于python django-admin.py startproject mysite不工作的问题
- ionic 设置logo 与 设置 启动页
- 分布式基础通信协议:paxos,totem和gossip
- Google欲争夺新闻入口 “ 即时文章”正式上线
- lnmp 用mongo
- 为visual studio code配置go开发环境(windows)
- Go 消费者和生产者的简单例子