题链:

http://www.lydsy.com/JudgeOnline/problem.php?id=3126

题解:

单调队列优化DP,神奇。。
(好像某次考试考过,当时我用了差分约束+SPFA优化,然后过了。。。)

记 L[i] 表示i左边没有覆盖i点的区间中的最大的左端点
R[i] 表示覆盖i的区间中的最小的左端点的前一个位置,
那么,如果在i位置放一个点的话,在L[i]~R[i]里面也必须要放一个点。
(这两个数组可以O(N)计算前后缀最大最小值得到。)
即定义 DP[i] 为i位置放点时的总点数,
转移:DP[i]=max(DP[j])+1 (L[i]<=j<=R[i])
然后可以用单调队列优化。
和普通的单调队列有点不同,因为多了一个R[i]这个转移的右端点限制。

其实本质还是相同的~~

考虑到L[i],R[i]都单增,

所以在原来队列的首尾指针l,r的基础上多开一个rr指针就好了。

代码:

#include<cstdio>
#include<cstring>
#include<iostream>
#define MAXN 200050
using namespace std;
int L[MAXN],R[MAXN],F[MAXN];
int N,M;
int main(){
static int Q[MAXN],l,r,_r;
scanf("%d%d",&N,&M);
for(int i=1;i<=N+1;i++) R[i]=i-1;
for(int i=1,l,r;i<=M;i++){
scanf("%d%d",&l,&r);
L[r+1]=max(L[r+1],l);
R[r]=min(R[r],l-1);
}
for(int i=2;i<=N+1;i++) L[i]=max(L[i-1],L[i]);
for(int i=N;i>=1;i--) R[i]=min(R[i],R[i+1]);
l=_r=r=1; Q[1]=0;
for(int i=1;i<=N+1;i++){
while(_r<=R[i]&&_r<=N){
if(F[_r]==-1){_r++; continue;}
while(l<=r&&F[Q[r]]<=F[_r]) r--;
Q[++r]=_r; _r++;
}
while(l<=r&&Q[l]<L[i]) l++;
if(l<=r) F[i]=F[Q[l]]+(i!=N+1?1:0);
else F[i]=-1;
}
printf("%d",F[N+1]);
return 0;
}

  

●BZOJ 3126 [Usaco2013 Open]Photo的更多相关文章

  1. 数据结构(线段树):BZOJ 3126: [Usaco2013 Open]Photo

    3126: [Usaco2013 Open]Photo Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 222  Solved: 116 Descrip ...

  2. Bzoj 3126[Usaco2013 Open]Photo 题解

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

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

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

  4. BZOJ 3126 [USACO2013 Open]Photo (单调队列优化DP)

    洛谷传送门 题目大意:给你一个长度为$n$的序列和$m$个区间,每个区间内有且仅有一个1,其它数必须是0,求整个序列中数字1最多的数量 神题,竟然是$DP$ 定义$f_{i}$表示第i位放一个1时,最 ...

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

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

  6. [bzoj 3048] [Usaco2013 Jan]Cow Lineup

    [bzoj 3048] [Usaco2013 Jan]Cow Lineup Description 给你一个长度为n(1<=n<=100,000)的自然数数列,其中每一个数都小于等于10亿 ...

  7. [BZOJ 3126] Photo

    [题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=3126 [算法] 差分约束系统 注意SPFA判负环的条件应为 : 若所有点入队次数之和 ...

  8. BZOJ 3315: [Usaco2013 Nov]Pogo-Cow( dp )

    我真想吐槽USACO的数据弱..= = O(n^3)都能A....上面一个是O(n²), 一个是O(n^3) O(n^3)做法, 先排序, dp(i, j) = max{ dp(j, p) } + w ...

  9. BZOJ 3314: [Usaco2013 Nov]Crowded Cows( 单调队列 )

    从左到右扫一遍, 维护一个单调不递减队列. 然后再从右往左重复一遍然后就可以统计答案了. ------------------------------------------------------- ...

随机推荐

  1. android 广播,manifest.xml注册,代码编写

    1.种 private void downloadBr(File file) {   // 广播出去,由广播接收器来处理下载完成的文件   Intent sendIntent = new Intent ...

  2. 用virtualenv建立多个Python独立开发环境

    不同的人喜欢用不同的方式建立各自的开发环境,但在几乎所有的编程社区,总有一个(或一个以上)开发环境让人更容易接受. 使用不同的开发环境虽然没有什么错误,但有些环境设置更容易进行便利的测试,并做一些重复 ...

  3. sql 多条记录插入

    --多条记录插入,用逗号分开值. INSERT dbo.studentinfor ( id, name, class, age, hpsw ) ', -- id - nvarchar(50) N'te ...

  4. PHP冒泡排序、选择排序、插入排序

    $arr = [1, 8, 7, 5, 4, 2, 11, 9, 20]; 冒泡排序: for ($i = 0; $i < count($arr); $i ++) { for ($j = 0; ...

  5. Python-Cpython解释器支持的进程与线程-Day9

    Cpython解释器支持的进程与线程 阅读目录 一 python并发编程之多进程 1.1 multiprocessing模块介绍 1.2 Process类的介绍 1.3 Process类的使用 1.4 ...

  6. angular2 学习笔记 ( app initialize 初始化 )

    refer : http://stackoverflow.com/questions/39033835/angularjs2-preload-server-configuration-before-t ...

  7. docker实践

    我的docker 学习笔记2   ps axf docker run -d cyf:sshd /usr/sbin -D   docker  ps docker-enter.sh 686 ps axf ...

  8. spring-oauth-server实践:授权方式四:client_credentials 模式下有效期内重复申请 access_token ?

    spring-oauth-server入门(1-12)授权方式四:client_credentials 模式下有效期内重复申请 access_token ? 一.失效重建邏輯 二.如果沒有失效,不会重 ...

  9. C#Json转DataTable

    需求:有一个log文件,需要整理成Excel,日志文件里面的数据都是json字符串 思路是,把Json字符串转换成DataTable,然后导出到Excel 在网上找了一些资料,整理了以下三种类型的Js ...

  10. Python之面向对象三

    面向对象的三大特性: 多态 多态指的是一类事物有多种形态.Python3天生支持多态. 动物有多种形态:人,狗,猪 import abc class Animal(metaclass=abc.ABCM ...