洛谷传送门

题目大意:给你一个长度为$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. Bash 如何取得当前正在执行的脚本的绝对路径?

    转自:http://blogread.cn/it/article/6549?f=wb Bash 如何取得当前正在执行的脚本的绝对路径? 如题,一般我们写Shell脚本的时候,都倾向使用绝对路径,这样无 ...

  2. JavaScript进阶【三】JavaScript面向对象的基础知识复习

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  3. Linux设备驱动--块设备(四)之“自造请求”(转)

    前面, 我们已经讨论了内核所作的在队列中优化请求顺序的工作; 这个工作包括排列请求和, 或许, 甚至延迟队列来允许一个预期的请求到达. 这些技术在处理一个真正的旋转的磁盘驱动器时有助于系统的性能. 但 ...

  4. python第四周:装饰器、迭代器、内置方法、数据序列化

    1.装饰器 定义:本质是一个函数,(装饰其他函数)就是为其他函数添加附加功能 原则:不能修改被装饰函数的源代码,不能修改被装饰函数的调用方式 实现装饰器的知识储备: 函数即“变量”.每当定义一个函数时 ...

  5. 面试准备专题——JVM,类编译,类加载,内存错误

    jvm体系总体分四大块: 类的加载机制 jvm内存结构 GC算法 垃圾回收 GC分析 命令调优 类的加载机制 类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法 ...

  6. 2015 Multi-University Training Contest 10 hdu 5411 CRB and Puzzle

    CRB and Puzzle Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)To ...

  7. BindingResult不能获取错误对象

    BindingResult不能获取错误对象,代码如下: @RequestMapping(value = "/login") public String error4( Model ...

  8. MySQL 触发器 -1

    MySQL包含对触发器的支持.触发器是一种与表操作有关的数据库对象,当触发器所在表上出现指定事件时,将调用该对象,即表的操作事件触发表上的触发器的执行. 创建触发器 在MySQL中,创建触发器语法如下 ...

  9. 根据BDUSS获取用户ID信息

    代码在 /data/svndir/business/workroot2/app/ecom/ubec/getuser

  10. [Tailwind] Apply mobile-first Responsive Classes in Tailwind

    In this lesson, we take a look at tailwind's mobile-first CSS architecture and learn how to apply st ...