[BZOJ3048][Usaco2013 Jan]Cow Lineup(单调队列)
2016-03-31 23:29
465 查看
题目描述
传送门题解
首先离散化。类似于单调队列的思想,一个头指针一个尾指针,向后移动的时候维护区间的种类数和它们的个数,保证区间种数-k=1。
边做边维护最大值。
代码
#include<algorithm> #include<iostream> #include<cstring> #include<cstdio> #include<vector> using namespace std; const int max_n=1e5+5; int n,k,head,tail,kinds,Max; int a[max_n],b[max_n],sum[max_n]; bool vis[max_n]; int main(){ // freopen("lineup.in","r",stdin); // freopen("lineup.out","w",stdout); scanf("%d%d",&n,&k); for (int i=1;i<=n;++i){ scanf("%d",&a[i]); b[i]=a[i]; } sort(b+1,b+n+1); int cnt=unique(b+1,b+n+1)-b-1; for (int i=1;i<=n;++i) a[i]=lower_bound(b+1,b+n+1,a[i])-b; head=1,tail=1; sum[a[1]]=1,kinds=1,vis[a[1]]=true; while (tail<n){ while (vis[ a[tail+1] ]||(!vis[ a[tail+1] ]&&kinds-1<k)){ tail++; if (!vis[ a[tail] ]){ vis[ a[tail] ]=true; kinds++; sum[ a[tail] ]=1; Max=max(Max,sum[ a[tail] ]); } else{ sum[ a[tail] ]++; Max=max(Max,sum[ a[tail] ]); } if (tail==n) break; } if (sum[ a[head] ]==1){ kinds--; vis[ a[head] ]=false; } sum[ a[head] ]--; head++; } printf("%d\n",Max); }
总结
相关文章推荐
- python 多继承(新式类) 三
- eclipse与cmake配合使用
- 分布式服务框架DUBBO(一)dubbo 简介
- 跟我一起学kafka(一)
- 旧发票要保留SIRET等信息,或者整个PDF
- Node初学者入门,一本全面的NodeJS教程(转载)
- 一、php环境
- C++作业2
- 第61课:SparkSQl数据加载和保存内幕深度解密实战学习笔记
- baiyun
- 解决SVN客户端修改log message失败的问题
- eclipse 安装svn插件
- Could not resolve archetype org.apache.maven.archetypes:maven-archetype-quickstart
- Spring理论知识点
- 1、有关pdo数据对象的学习。。。
- 06-maven聚合和继承性
- 猴王水果竞猜源码
- 3月英语——Topic
- 文章标内存到底是什么东西,到底是如何分配的?
- ahtaPeerTyraniB.257