Codeforces 616 D. Longest k-Good Segment
2016-01-14 22:28
651 查看
传送门:http://codeforces.com/problemset/problem/616/D
Two Pointers
大概思想为:区间中为每一个l,找一个最远的r使得满足条件,一般思想都为,如果对应于l的为r,则对应于l+1的必为r+1以后的值,因为这以内的值必定都满足题意,因此复杂度就为O(2*n)了!!
此题打的时候马虎点:
首先是区间左右端点初值的赋值,应该为1,
然后是左端点一定要有赋值,即l=1;
然后是每个点的计数器,每扫一次都应该加1,而不是说没出现的时候再+1,这实在是不小心了!!
Two Pointers
大概思想为:区间中为每一个l,找一个最远的r使得满足条件,一般思想都为,如果对应于l的为r,则对应于l+1的必为r+1以后的值,因为这以内的值必定都满足题意,因此复杂度就为O(2*n)了!!
此题打的时候马虎点:
首先是区间左右端点初值的赋值,应该为1,
然后是左端点一定要有赋值,即l=1;
然后是每个点的计数器,每扫一次都应该加1,而不是说没出现的时候再+1,这实在是不小心了!!
[code]#include<bits/stdc++.h> using namespace std; #define ll long long const int maxn=5e5+10; int vis[(int)1e6+10]; int a[maxn]; int n,k,l,r;int maxl,maxr; int main(){ scanf("%d%d",&n,&k); int cur=1; maxl=1;maxr=1; for(int i=1;i<=n;i++){ scanf("%d",&a[i]); } int l=1;vis[a[1]]=1; int maxlen=0; for(int r=2;r<=n;r++){ if(!vis[a[r]]){ cur++; } vis[a[r]]++; if(cur>k){ while(vis[a[l]]>0){ vis[a[l]]--; if(vis[a[l]]==0){ cur--;l++;break; } l++; } } if(r-l>maxlen){ maxlen=r-l;maxl=l;maxr=r; } } printf("%d %d\n",maxl,maxr); return 0; }
相关文章推荐
- django 小技巧
- django 学习-12 Django表单 初步
- django 学习-11 Django模型数据模板呈现
- django 学习-10 Django多对多关系模型
- google商店打不开,闪退 google play服务已停止
- Django学习--9 Admin
- go基本语法学习笔记之流程控制
- 【MongoBD】MongoBD持久化
- Ubuntu1404安装gogs过程
- Django 运行错误no enough space left on disk
- Snapdragon Flight
- Golang初级系列教程-继承和子类
- golang 并发 chan
- go基本语法学习笔记之类型
- protobuf
- go基本语法学习笔记之变量与常量
- Golang初级系列教程-结构体方法-Methods on structs
- 第一个GO程序
- Django学习--9 多对一关系模型
- Golang初级系列教程-结构体匿名字段-Anonymous fields in structs