\(\\\)

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的更多相关文章

  1. USACO翻译:USACO 2013 NOV Silver三题

    USACO 2013 NOV SILVER 一.题目概览 中文题目名称 未有的奶牛 拥挤的奶牛 弹簧牛 英文题目名称 nocow crowded pogocow 可执行文件名 nocow crowde ...

  2. USACO翻译:USACO 2013 DEC Silver三题

    USACO 2013 DEC SILVER 一.题目概览 中文题目名称 挤奶调度 农场航线 贝西洗牌 英文题目名称 msched vacation shuffle 可执行文件名 msched vaca ...

  3. USACO翻译:USACO 2013 JAN三题(1)

    USACO 2013 JAN 一.题目概览 中文题目名称 镜子 栅栏油漆 奶牛排队 英文题目名称 mirrors paint lineup 可执行文件名 mirrors paint lineup 输入 ...

  4. USACO 2013 Nov Silver Pogo-Cow

    最近因为闲的蛋疼(停课了),所以开始做一些 USACO 的银组题.被完虐啊 TAT 貌似 Pogo-Cow 这题是 2013 Nov Silver 唯一一道可说的题目? Pogo-Cow Descri ...

  5. USACO 2013 November Contest Gold 简要题解

    Problem 1. Empty Stalls 扫两遍即可. Problem 2. Line of Sight 我们发现能互相看见的一对点一定能同时看见粮仓的某一段.于是转换成有n段线段,问有多少对线 ...

  6. BZOJ3075[USACO 2013 Mar Gold 3.Necklace]——AC自动机+DP

    题目描述 给你一个长度为n的字符串A,再给你一个长度为m的字符串B,求至少在A中删去多少个字符才能使得B不是A的子串.注:该题只读入A和B,不读入长度,先读入A,再读入B.数据保证A和B中只含小写字母 ...

  7. 【USACO】 Balanced Photo

    [题目链接] 点击打开链接 [算法] 树状数组 [代码] #include<bits/stdc++.h> using namespace std; int i,N,ans,l1,l2; ] ...

  8. BZOJ 4094 USACO 2013 Dec. Optimal Milking

    线段树 每个节点保存4个值,both表示左右端点都取,neither表示左右端点都不取,left表示只取左端点,right表示只取右端点. 维护的特殊姿势: $cur$的$both=max(ls.l+ ...

  9. 【usaco 2013 open yinyang】阴阳

    题目 Farmer John 正在在计划自己的农场漫步.他的农场的结构就像一棵树:农场有N个谷仓(1<= N <=100,000),分别由N-1条路链接.这样,他便可以通过这些谷仓间的道路 ...

随机推荐

  1. hdoj-1242-Rescue【广搜+优先队列】

    Rescue Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submis ...

  2. 【Java集合源代码剖析】HashMap源代码剖析

    转载请注明出处:http://blog.csdn.net/ns_code/article/details/36034955 您好,我正在參加CSDN博文大赛,假设您喜欢我的文章.希望您能帮我投一票.谢 ...

  3. UISlider无法拖动进度条的问题解决

    UISlider无法拖动进度条的问题解决 最近业务中的视频播放使用到了UISlider,但是有一个奇怪的问题,就是在Modar出来的控制器中UISlider是可以正常使用的,但是在Push出来的控制器 ...

  4. 2015/12/29 eclipse 设置要点 空间 项目 类 eclipse汉化

    开始使用eclipse,双击eclipse.exe文件,启动eclipse.程序会显示一个工作空间的对话框,工作空间用来存放你的项目文件,你可以使用程序默认的,点击确定即可,你也可以重新选择一个文件夹 ...

  5. jupyter环境的安装

    1,什么是jupyter notebook? 简介:jupyter notebook是基于网页的用户交互计算机的应用程序,其可被用于全过程计算:开发,文档编写,运行代码,和展示结果 简而言之,Jupy ...

  6. struts2的一些小问题

    1.action和ValueStack的关系2.ValueStack的类set()方法和setValue()方法的区别3.ValueStack的类push()方法的作用4.从ValueStack对象中 ...

  7. stl之vector的应用

    这里主要是对vector容器的一些常见应用的总结.至于vector的构造函数及初始化能够參考http://blog.csdn.net/lsh_2013/article/details/21191289 ...

  8. HBase使用教程

    1     基本介绍 1.1 前言 HBase – Hadoop Database.是一个分布式的.面向列的开源数据库,该技术来源于 Fay Chang 所撰写的Google论文"Bigta ...

  9. jQuery - AJAX 级联变动

    此篇文章主要是用来记忆使用JQUERY+AJAX技术实现 二级级联变动 : 当第一个下拉框变动时,第二个下拉列表框中也将会随之变动. JSP: ---------------------------- ...

  10. UICollectionView与UITableView混用手势冲突

    前言 最近在重构某个模块,以后别人封装的所谓的基类就像一坨死一样,看见就恶心,相信同行的你们能够明白那种心情.为什么要重构?并不是真的因为它像一坨死,而是因为这个模块是用户使用最频繁的,而且出现了不少 ...