[ USACO 2013 OPEN ] Photo
\(\\\)
Description
有一个长度为 \(n\) 的奶牛队列,奶牛颜色为黑或白。
现给出 \(m\) 个区间 \([L_i,R_i]\) ,要求:每个区间里 有且只有一只黑牛 。
问满足所有给出限制最少有多少头黑牛,若无合法方案输出 \(-1\) 。
- \(n\le 2\times 10^5,m\le 10^5\)
\(\\\)
Solution
单调队列优化。
设 \(f[i]\) 表示,第 \(i\) 个位置为黑牛, \([1,i]\) 的设置符合所有限制,最少有多少头黑牛。
考虑合法的转移区间的限制有哪些。
每个区间里只能有一头黑牛。
这个限制说明,所有包含 \(i\) 的区间里,都不能再有黑牛,所以转移区间右端点为,包含 \(i\) 的区间里最小的的 \(L_i-1\) 。
每个区间里必须有一头黑牛。
这个限制比较麻烦。因为不能有区间空着,所以所有不包含 \(i\) 的区间里都要有黑牛。
所以我们要找到,不包含 \(i\) 的区间里最大的 \(L_i\),转移的右端点就是这个 \(L_i\) 。
然后就可以单调队列优化了。注意不合法状态不放到单调队列里。
\(\\\)
Code
写起来其实还是可以判断代码能力的。
有一种比较优秀的写法 不知道比我原来yy的高到哪里去了 ,利用了一个单调性。
一个点转移的合法区间左右端点其实都有单调性。
如果包含这个位置的最左端点要小于上一个位置,显然上一个位置可以直接换成这个值。
如果不包含这个位置的最右端点要小于上一个位置,显然这个位置的右端点也可以直接换成上一个位置的值。
这样一来我们的预处理是线性的了,也就是说,对于每个区间,我们只需要标记区间右端点和区间右端点 \(+1\) 的位置,最后扫描一遍所有位置。
还有一个技巧是统计答案的时候,不需要讨论最后一个位置什么颜色,只需要让数列长度 \(+1\) , 最后一个位置的 \(f\) 值就是答案。
#include<cmath>
#include<cstdio>
#include<cctype>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#define N 200010
#define R register
#define gc getchar
#define inf 2000000000
using namespace std;
inline int rd(){
int x=0; bool f=0; char c=gc();
while(!isdigit(c)){if(c=='-')f=1;c=gc();}
while(isdigit(c)){x=(x<<1)+(x<<3)+(c^48);c=gc();}
return f?-x:x;
}
int n,m,l[N],r[N],f[N],q[N],hd,tl;
int main(){
n=rd(); m=rd();
for(R int i=1;i<=n+1;++i) r[i]=i-1;
for(R int i=1,sl,sr;i<=m;++i){
sl=rd(); sr=rd();
r[sr]=min(r[sr],sl-1);
l[sr+1]=max(l[sr+1],sl);
}
for(R int i=1;i<=n+1;++i) l[i]=max(l[i],l[i-1]);
for(R int i=n;i;--i) r[i]=min(r[i],r[i+1]);
int ptr=1; hd=tl=1;
for(R int i=1;i<=n+1;++i){
while(ptr<=r[i]){
if(f[ptr]<0){++ptr;continue;}
while(f[ptr]>f[q[tl]]&&hd<=tl) --tl;
q[++tl]=ptr; ++ptr;
}
while(q[hd]<l[i]&&hd<=tl) ++hd;
if(hd<=tl) f[i]=f[q[hd]]+(i!=n+1);
else f[i]=-1;
}
printf("%d\n",f[n+1]);
return 0;
}
[ USACO 2013 OPEN ] Photo的更多相关文章
- USACO翻译:USACO 2013 NOV Silver三题
USACO 2013 NOV SILVER 一.题目概览 中文题目名称 未有的奶牛 拥挤的奶牛 弹簧牛 英文题目名称 nocow crowded pogocow 可执行文件名 nocow crowde ...
- USACO翻译:USACO 2013 DEC Silver三题
USACO 2013 DEC SILVER 一.题目概览 中文题目名称 挤奶调度 农场航线 贝西洗牌 英文题目名称 msched vacation shuffle 可执行文件名 msched vaca ...
- USACO翻译:USACO 2013 JAN三题(1)
USACO 2013 JAN 一.题目概览 中文题目名称 镜子 栅栏油漆 奶牛排队 英文题目名称 mirrors paint lineup 可执行文件名 mirrors paint lineup 输入 ...
- USACO 2013 Nov Silver Pogo-Cow
最近因为闲的蛋疼(停课了),所以开始做一些 USACO 的银组题.被完虐啊 TAT 貌似 Pogo-Cow 这题是 2013 Nov Silver 唯一一道可说的题目? Pogo-Cow Descri ...
- USACO 2013 November Contest Gold 简要题解
Problem 1. Empty Stalls 扫两遍即可. Problem 2. Line of Sight 我们发现能互相看见的一对点一定能同时看见粮仓的某一段.于是转换成有n段线段,问有多少对线 ...
- BZOJ3075[USACO 2013 Mar Gold 3.Necklace]——AC自动机+DP
题目描述 给你一个长度为n的字符串A,再给你一个长度为m的字符串B,求至少在A中删去多少个字符才能使得B不是A的子串.注:该题只读入A和B,不读入长度,先读入A,再读入B.数据保证A和B中只含小写字母 ...
- 【USACO】 Balanced Photo
[题目链接] 点击打开链接 [算法] 树状数组 [代码] #include<bits/stdc++.h> using namespace std; int i,N,ans,l1,l2; ] ...
- BZOJ 4094 USACO 2013 Dec. Optimal Milking
线段树 每个节点保存4个值,both表示左右端点都取,neither表示左右端点都不取,left表示只取左端点,right表示只取右端点. 维护的特殊姿势: $cur$的$both=max(ls.l+ ...
- 【usaco 2013 open yinyang】阴阳
题目 Farmer John 正在在计划自己的农场漫步.他的农场的结构就像一棵树:农场有N个谷仓(1<= N <=100,000),分别由N-1条路链接.这样,他便可以通过这些谷仓间的道路 ...
随机推荐
- [Sciter] Script与Native交互
原帖地址:http://www.cnblogs.com/yinxufeng/p/5653920.html Script与Native交互基础简化方式Script调用NativeNative调用Scri ...
- web 界面设计---大道至简
http://www.cnblogs.com/coder2012/p/4023442.html 一个非常精简的webpy页面博客 qing.weibo.com 新浪的轻微博也不错精简
- linux-shell脚本命令之awk
[ awk简单介绍: ] awk能够从一个文本中获取部分内容, 或者对这个文本进行排版, 使它按某种格式输出. [ awk工作流程: ] awk会把文件一行内容去到内存里, 然后对这行内容进行分段 ( ...
- 为Html.EditorForModel自定义模版
对于MVC视图渲染来说,大家应该不会陌生,但对于模型的渲染,不知道是否听说过,主要是说Model通过它属性的相关特性(DataType,UIHint)来将它们自动渲染到View上,这是一个比较不错的技 ...
- 矩阵经典题目七:Warcraft III 守望者的烦恼(矩阵加速递推)
https://www.vijos.org/p/1067 非常easy推出递推式f[n] = f[n-1]+f[n-2]+......+f[n-k]. 构造矩阵的方法:构造一个k*k的矩阵.当中右上角 ...
- 密码过期导致Oracle process耗尽问题
oracle忽然连不上! 大致是报这样的错: ORA-12516: TNS: 监听程序找不到符合协议堆栈要求的可用处理程序 ORA-12520: TNS: 监听程序无法为请求的服务器类型找到可用的处理 ...
- 2016/3/10 PHP (超文本预处理器) 是什么?
PHP(外文名:PHP: Hypertext Preprocessor,中文名:“超文本预处理器”)是一种通用开源脚本语言.语法吸收了C语言.Java和Perl的特点,利于学习,使用广泛,主要适用于W ...
- debian repository的成长过程
1 基本概念 1.1 健康的安装 在端系统中的一次健康的安装指的是,在安装的包的集合中,所有的依赖都满足,并且没有冲突存在. 这的健康的安装是相对于端系统而言的,并不是相对于整个repo而言的.对整个 ...
- JSON: Circular Dependency Errors
If you’re using Object Relational Mapping frameworks like Hibernate, and are using the bi-directiona ...
- js常用操作事件
触发描述 方法 用法 点击 onclick="method();" 变换 onchange="testChange();" 双击 ondblclick= ...