洛谷传送门

题目大意:给你一个长度为$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)的更多相关文章

  1. bzoj 3126: [Usaco2013 Open]Photo——单调队列优化dp

    Description 给你一个n长度的数轴和m个区间,每个区间里有且仅有一个点,问能有多少个点 Input * Line 1: Two integers N and M. * Lines 2..M+ ...

  2. bzoj3126[Usaco2013 Open]Photo 单调队列优化dp

    3126: [Usaco2013 Open]Photo Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 374  Solved: 188[Submit] ...

  3. BZOJ 1499 [NOI2005] 瑰丽华尔兹 | 单调队列优化DP

    BZOJ 1499 瑰丽华尔兹 | 单调队列优化DP 题意 有一块\(n \times m\)的矩形地面,上面有一些障碍(用'#'表示),其余的是空地(用'.'表示).每时每刻,地面都会向某个方向倾斜 ...

  4. bzoj 1499 [NOI2005]瑰丽华尔兹——单调队列优化dp

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1499 简单的单调队列优化dp.(然而当时却WA得不行.今天总算填了坑) 注意滚动数组赋初值应 ...

  5. luogu3084 Photo 单调队列优化DP

    题目大意 农夫约翰决定给站在一条线上的N(1 <= N <= 200,000)头奶牛制作一张全家福照片,N头奶牛编号1到N.于是约翰拍摄了M(1 <= M <= 100,000 ...

  6. bzoj 3831 Little Bird (单调队列优化dp)

    /*先贴个n*n的*/ #include<iostream> #include<cstdio> #include<cstring> #define maxn 100 ...

  7. ●BZOJ 3126 [Usaco2013 Open]Photo

    题链: http://www.lydsy.com/JudgeOnline/problem.php?id=3126 题解: 单调队列优化DP,神奇.. (好像某次考试考过,当时我用了差分约束+SPFA优 ...

  8. 单调队列优化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 ...

  9. P4381 [IOI2008]Island(基环树+单调队列优化dp)

    P4381 [IOI2008]Island 题意:求图中所有基环树的直径和 我们对每棵基环树分别计算答案. 首先我们先bfs找环(dfs易爆栈) 蓝后我们处理直径 直径不在环上,就在环上某点的子树上 ...

随机推荐

  1. SurgingFunction

  2. CNN实现terecord、数据集、模型训练

    AlexNet(Alex Krizhevsky,ILSVRC2012冠军)适合做图像分类.层自左向右.自上向下读取,关联层分为一组,高度.宽度减小,深度增加.深度增加减少网络计算量. 训练模型数据集 ...

  3. some untracked working tree files问题解决

    我使用的是idea,情境是在使用git同步代码的时候,出现的错误. 我这里报错是在右上角的显示信息,其中有一个show view的可点击连接 我点击之后将上面展示的文件删除之后重新同步代码,成功.

  4. 为了使界面组件更圆滑,Swing,且跨系统

  5. Exchange EMC打开出错 解决

    Exchange控制台打开出错如何解决 1.卸载win server功能中的winrm iis 2.重启 3.安装winrm iis 4.查看default web site 有没有绑定80端口,没有 ...

  6. ASP.NET中的Webconfig 和 Global.asax区别

    Web.Config与Global.asax的区别: Config可以根据不同的错误类型定义不同的错误页,网站重定义转向新的错误页面. Global,在全局错误中写入应用程序事件错误信息,并在当前页输 ...

  7. [SharePoint2010开发入门经典]四、开发者常见任务

    本章概要: 1.创建不同种类的web部件,包括标准的,可视化的还有数据绑定web部件 2.理解列和内容类型,如何使用它们创建列表 3.理解如何与SPS交互,使用SPS API调用数据 4.创建编辑页面 ...

  8. JavaScript之this释疑

    近期进修JavaScript,看了"You Don't Know JS"这本书,认为是本JavaScript内功上乘心法,有一定JavaScript基础朋友一定要看看(不推荐入门小 ...

  9. Android Touch事件分发过程

    虽然网络上已经有非常多关于这个话题的优秀文章了,但还是写了这篇文章,主要还是为了加强自己的记忆吧,自己过一遍总比看别人的分析要深刻得多.那就走起吧. 简单演示样例 先看一个演示样例 : 布局文件 : ...

  10. CF 372B Counting Rectangles is Fun [dp+数据维护]

    题意,给出一个n行m列的矩阵 里面元素是0或者1 给出q个询问 a,b,c,d 求(a,b)到(c,d)有多少个由0组成的矩形 我们定义 watermark/2/text/aHR0cDovL2Jsb2 ...