【USACO 2013 January Gold】奶牛排队
来源:互联网 发布:手机去水印软件 编辑:程序博客网 时间:2024/06/10 07:48
Description
农夫约翰的N(1 <= N <= 100,000)只奶牛排成了一队,每只牛都用编上了一个“血统编号”,该编号为范围0...1,000,000,000的整数。血统相同的奶牛有相同的编号,也就是可能有多头奶牛是相同的"血统编号"。
约翰觉得如果连续排列的一段奶牛有相同的血统编号的话,奶牛们看起来会更具有威猛。为了创造这样的连续段,约翰最多能选出k种血统的奶牛,并把他们全部从队列中赶走。请帮助约翰计算这样做能得到的由相同血统编号的牛构成的连续段的长度最大是多少?
Input
第一行,两个空格间隔的整数N和K
接下来N行, 每行一个整数,表示对应奶牛的血统编号
Output
一行,一个整数,表示所能得到的最大连续段的长度
Sample Input
9 1273773757
Sample Output
4
Hint
样例说明,只能删除一种奶牛,删除3号血统的奶牛可得到2777757,其中最长的一段连续数字是4个7
【分析】
原题目其实可以等价为:选择一段区间[i,j],使得区间内至少有k+1中颜色,定义Ai表示这一段区间最多的一种颜色的个数。那么答案显然就是max{Ai}了。
枚举区间左右端点肯定是不行的,我们只需要枚举左端点,而右端点可以继承上一个右端点的位置,然后往后延展至满足条件的最远处。而取区间内颜色最多的一种,我们只需要用一个堆或者优先队列来动态维护即可。
【代码】
/******************* ID:CiocioLANG:C++DATE:2013-12-16TASK:USACO-2013-Jan-Gold*******************/#include <cstdio>#include <cstdlib>#include <cstring>#include <cmath>#include <iostream>#include <algorithm>#include <queue>#include <utility>#include <functional>#include <vector>#include <map>using namespace std;#define MAXN 100005#define m_p make_pairtypedef pair<int,int> pii;struct node{int v,bh;bool operator<(const node &A)const{return v<A.v;}}P[MAXN];int N,K;int v[MAXN],cnt[MAXN];template <class T>void _read(T &x){char tt=getchar();while(tt<'0'||'9'<tt) tt=getchar();for(x=0;'0'<=tt&&tt<='9';x=x*10+tt-'0',tt=getchar());}void _init(){_read(N);_read(K);for(int i=1;i<=N;i++) _read(P[i].v),P[i].bh=i;sort(P+1,P+N+1);int bh=0;P[0].v=-1;v[0]=-1;for(int i=1;i<=N;i++) //离散化重编号,为了使颜色可为数组下标{if(P[i].v!=P[i-1].v) bh++;v[P[i].bh]=bh;}}priority_queue<pii,vector<pii>,less<pii> >PQ; //优先队列,less表示大数优先void _solve(){while(!PQ.empty()) PQ.pop();int now,ans;now=ans=cnt[v[1]]=1;PQ.push(m_p(cnt[v[1]],v[1]));for(int i=1,j=1;i<=N&&j<=N;) //[i,j]这段区间{while(j<N&&now<K+1) //j继承并向后延展{j++;if(!cnt[v[j]]) now++;cnt[v[j]]++;PQ.push(m_p(cnt[v[j]],v[j]));}while(now==K+1&&j<N&&cnt[v[j+1]]!=0) //处理颜色已满,但可继续延展的情况{j++;cnt[v[j]]++;PQ.push(m_p(cnt[v[j]],v[j]));}while((!PQ.empty())&&(PQ.top().first!=cnt[PQ.top().second])) //从优先队列中去除不符条件的PQ.pop();if(!PQ.empty()) //更新答案 ans=max(ans,PQ.top().first);cnt[v[i]]--; //左端点向后移一位if(cnt[v[i]]==0) now--;PQ.push(m_p(cnt[v[i]],v[i]));i++;}cout<<ans<<endl;}int main(){_init();_solve();return 0;}
0 0
- 【USACO 2013 January Gold】奶牛排队
- 【USACO 2013 January Gold】座位 --线段树
- P2052【USACO 2013 January Gold】座位
- 【USACO 2013 March Gold】奶牛逃跑
- 【Usaco Nov08 Gold】 安慰奶牛
- USACO 2012 January Contest, Gold Division Solution
- [USACO 2012 January Gold] Video Game Combos
- P2770【USACO 2014 January Gold】难度系数
- 【Usaco Nov08 Gold】混乱的奶牛
- 【Usaco 2010 NOV Gold】奶牛的图片
- 【Usaco 2010 NOV Gold】奶牛的图片
- usaco contest 2008.11 gold 安慰奶牛
- [usaco gold 2016.1]生气的奶牛
- USACO 2017 January Contest, Gold Problem 1. Balanced Photo
- USACO 2017 January Contest, Gold Problem 2. Hoof, Paper, Scissors
- USACO 2011 Feb Gold 1.Cowlphabet 奶牛文字
- 【Usaco Oct08 Gold】奶牛串门(Pasture Walking)(LCA)
- 【4连WA】【Usaco Oct08 Gold】奶牛串门(Pasture Walking)
- TortoiseSVN 编辑日志信息报错
- hibernate打印sql参数
- signal(SIGCHLD, SIG_IGN)和signal(SIGPIPE, SIG_IGN);
- 婚礼上的誓言
- 高一主题班会纪实:因为离别
- 【USACO 2013 January Gold】奶牛排队
- Powerdesigner——打印错误
- JBoss 系列六十七:JBoss 7/WildFly 集群之有状态会话Bean集群 - I(基本理论)
- c#中odp.net 4.0利用odac操作oracle数据库学习(四)
- SessionFactory.getCurrentSession与openSession的区别
- js数组处理学习笔记一
- LINUX SSH jail 笼环境下如何添加命令
- 修改ZigBee路由深度及网络容量
- Makefile中库链接问题