BZOJ 3126 [USACO2013 Open]Photo (单调队列优化DP)
题目大意:给你一个长度为$n$的序列和$m$个区间,每个区间内有且仅有一个1,其它数必须是0,求整个序列中数字1最多的数量
神题,竟然是$DP$
定义$f_{i}$表示第i位放一个1时,最多的1的数量
因为每个区间至少一个点,如果要在$i$位置放一个1,显然在$i$左侧没覆盖$i$的区间中,选择一个位置$j$,$j$必须保证如果在$j$放一个1,那么它右侧没有空区间再需要放1,显然$j$是没覆盖i的区间中最大的左端点,维护一个数组$l_{i}$,表示最左端能转移的区间
因为每个区间至多一个点,如果要在$i$位置放一个1,显然在$i$左侧覆盖了$i$的区间中,选择一个位置$j$,$j$必须保证和$i$不处于任何一个相同的区间内,显然$j$是覆盖了$i$的所有区间中最小的左端点-1,维护一个数组$r_{i}$,表示最右端能转移的区间
$f_{i}=max{f_{j},j\in[l_{i},r_{i}]}$
发现$l_{i}$和$r_{i}$都具有单调递增的性质,用单调队列优化即可,当然也可以用线段树
细节比较多,建议不要看代码自己思考
#include <cstdio>
#include <cstring>
#include <algorithm>
#define N1 200100
#define ll long long
#define inf 0x3f3f3f3f
using namespace std; int gint()
{
int ret=,fh=;char c=getchar();
while(c<''||c>''){if(c=='-')fh=-;c=getchar();}
while(c>=''&&c<=''){ret=ret*+c-'';c=getchar();}
return ret*fh;
}
int n,m;
int f[N1],l[N1],r[N1];
int que[N1];
struct node{int l,r;}a[N1];
int cmp1(node s1,node s2){
if(s1.r!=s2.r) return s1.r<s2.r;
else return s1.l>s2.l;}
int cmp2(node s1,node s2){
if(s1.r!=s2.r) return s1.r>s2.r;
else return s1.l<s2.l;} int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<=m;i++)
a[i].l=gint(),a[i].r=gint();
sort(a+,a+m+,cmp2);
int k=,mi=n+;
for(int i=n+;i>=;i--){
while(k<=m){
if(a[k].r>=i)
mi=min(mi,a[k].l),k++;
else break;}
if(i<=mi) mi=i;
r[i]=mi-;
}
sort(a+,a+m+,cmp1);
int ma=;k=;
for(int i=;i<=n+;i++){
while(k<=m){
if(a[k].r<i)
ma=max(ma,a[k].l),k++;
else break;}
l[i]=ma;
}
int hd=,tl=,j=,ans=-;
for(int i=;i<=n;i++){
if(l[i]>r[i]){f[i]=-inf;continue;}
while(j<=r[i]&&j<=n){
while(hd<=tl&&f[j]>=f[que[tl]])
tl--;
que[++tl]=j,j++;}
while(hd<=tl&&que[hd]<l[i])
hd++;
f[i]=(hd<=tl)?(f[que[hd]]+):;
}
for(int i=l[n+];i<=r[n+];i++)
ans=max(ans,f[i]);
printf("%d\n",ans);
return ;
}
BZOJ 3126 [USACO2013 Open]Photo (单调队列优化DP)的更多相关文章
- bzoj 3126: [Usaco2013 Open]Photo——单调队列优化dp
		
Description 给你一个n长度的数轴和m个区间,每个区间里有且仅有一个点,问能有多少个点 Input * Line 1: Two integers N and M. * Lines 2..M+ ...
 - bzoj3126[Usaco2013 Open]Photo 单调队列优化dp
		
3126: [Usaco2013 Open]Photo Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 374 Solved: 188[Submit] ...
 - BZOJ 1499 [NOI2005] 瑰丽华尔兹 | 单调队列优化DP
		
BZOJ 1499 瑰丽华尔兹 | 单调队列优化DP 题意 有一块\(n \times m\)的矩形地面,上面有一些障碍(用'#'表示),其余的是空地(用'.'表示).每时每刻,地面都会向某个方向倾斜 ...
 - bzoj 1499 [NOI2005]瑰丽华尔兹——单调队列优化dp
		
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1499 简单的单调队列优化dp.(然而当时却WA得不行.今天总算填了坑) 注意滚动数组赋初值应 ...
 - luogu3084 Photo 单调队列优化DP
		
题目大意 农夫约翰决定给站在一条线上的N(1 <= N <= 200,000)头奶牛制作一张全家福照片,N头奶牛编号1到N.于是约翰拍摄了M(1 <= M <= 100,000 ...
 - bzoj 3831 Little Bird (单调队列优化dp)
		
/*先贴个n*n的*/ #include<iostream> #include<cstdio> #include<cstring> #define maxn 100 ...
 - ●BZOJ 3126 [Usaco2013 Open]Photo
		
题链: http://www.lydsy.com/JudgeOnline/problem.php?id=3126 题解: 单调队列优化DP,神奇.. (好像某次考试考过,当时我用了差分约束+SPFA优 ...
 - 单调队列优化DP || [NOI2005]瑰丽华尔兹 || BZOJ 1499 || Luogu P2254
		
题外话:题目极好,做题体验极差 题面:[NOI2005]瑰丽华尔兹 题解: F[t][i][j]表示第t时刻钢琴位于(i,j)时的最大路程F[t][i][j]=max(F[t-1][i][j],F[t ...
 - P4381 [IOI2008]Island(基环树+单调队列优化dp)
		
P4381 [IOI2008]Island 题意:求图中所有基环树的直径和 我们对每棵基环树分别计算答案. 首先我们先bfs找环(dfs易爆栈) 蓝后我们处理直径 直径不在环上,就在环上某点的子树上 ...
 
随机推荐
- 原生ajax的get和post方法封装
			
get 方法 function serialize (data) { if (!data) { return ''; } var paris = []; for (var key in data) { ...
 - 【Computer Vision】 复现分割网络(1)——SegNet
			
目录 Tags: ComputerVision 编译 数据处理 训练结果 Reference Tags: ComputerVision 编译 src/caffe/layers/contrastive_ ...
 - 4.1、Ansible模块
			
ansible-doc -l 列出所有模块 ansible-doc 模块名 查看模块的help说明 ansible-doc -s module_name:获取指定模块的使用信息 ***文 ...
 - JavaScript链式编程模拟Jquery函数
			
<span>Hello,World!</span> <script type="text/javascript"> Jq = function ...
 - 如何用Vim提高开发效率
			
即可 ●输入m获取到文章目录 推荐↓↓↓ C/C++编程 更多推荐<18个技术类公众微信> 涵盖:程序人生.算法与数据结构.黑客技术与网络安全.大数据技术.前端开发.Java.Python ...
 - Android Otto调研
			
这两天对Otto进行了一个简单的调研,发现官网特别简单差点儿没东西,github上给的sample也不是非常好.网上的技术博客也差点儿千篇一律,我就把自己的心得体会写下来吧,如有缘者看见望其少走弯路. ...
 - 6 Javascript:函数
			
函数 函数是面向任务的. 当我们面临一个须要可问题的时候.往往无处下手.这时候.须要将问题分解为多个任务,从而逐一击破. 这里就须要函数的帮助. 语法 function Name() { Body() ...
 - Oracle配置网络服务
			
对于Oracle来说.不管是连接本地数据库还是远程连接server数据库,都须要在本机配置网络服务才可连接. 大家可能不明确为什么. 先拿SqlServer来说.SqlServer在连接数据库的时候仅 ...
 - 遗传奥秘的伟大揭秘者:J.Watson
			
J.Watson的近照: 人们公认,揭秘生命体的遗传奥秘(DNA)是二十世纪最伟大的科技成果之中的一个,或许就是人类最伟大的科技进步(而不是"之中的一个"). 上世纪是人类做出伟大 ...
 - Android接口和框架学习
			
Android接口和框架学习 缩写: HAL:HardwareAbstraction Layer.硬件抽象层 CTS:CompatibilityTest Suite,兼容性測试套件 Android让你 ...