[ 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条路链接.这样,他便可以通过这些谷仓间的道路 ...
随机推荐
- C++对象模型——解构语意学(第五章)
5.4 对象的效率 (Object Efficiency) 在下面的效率測试中,对象构造和拷贝所须要的成本是以Point3d class声明为基准,从简单形式逐渐到复杂形式,包含Plain Ol ...
- html2canvas 导出包含滚动条的内容
import html2canvas from 'html2canvas'; exportPDF() { // 导出为 pdf let dom = document.querySelector('yo ...
- 嵌入式开发之dmva---基于DMVA2平台720P高清智能分析
http://wenku.baidu.com/view/2190746ba45177232f60a2b8.html
- python中一切皆是对象,对象都是在堆上存放的,一切都是指针
1 由于对象都是在堆上存放的,所以,返回值可以任意返回. 这样看来,闭包里面的外部函数的内部变量也是对象,所以,当返回的内部函数被调用时,这个外部函数的变量就没有被释放. 这样看来,返回时,不需要考虑 ...
- VCL代码的一些设计手法(使用OO虚函数的技巧)
1. 抽象类法(VCL不推荐):第一,允许创建抽象类对象,因为语法没问题,但允许其错误.第二,接口更好.第三,如果是混合抽象类,则推荐Place Holder方法2. Place Holder(占位) ...
- [JS进阶] HTML5 之文件操作(file)
版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/oscar999/article/details/37499743 前言 在 HTML 文档中 < ...
- hosts所在文件夹以及***
hosts所在文件夹: Windows 系统hosts位于 C:\Windows\System32\drivers\etc\hosts Android(安卓)系统hosts位于 /etc/hosts ...
- Lightoj 1009 - Back to Underworld
1009 - Back to Underworld PDF (English) Statistics Forum Time Limit: 4 second(s) Memory Limit: 32 ...
- Buildroot构建指南——根文件系统(Rootfs)【转】
本文转载自; 版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[+] Buildroot构建指南——根文件系统(Rootfs) Buildroot的Rootfs构建流程有一个大 ...
- POJ2594 Treasure Exploratio —— 最小路径覆盖 + 传递闭包
题目链接:https://vjudge.net/problem/POJ-2594 Treasure Exploration Time Limit: 6000MS Memory Limit: 655 ...