很神仙的dp...假装自己看懂了,以后回来复习复习...

设$f_{i}$表示从$1$到$i$,且$i$这个点必放的最大数量。

一个区间有两个限制条件:至少放一个,至多放一个。

因为一个区间至多要放一个,所以所有包含这个点的区间都不能再放,设$r_{i}$表示包含这个点的区间中最小的左端点$ - 1$。

因为一个区间至少要放一个,所以不能有区间中一个都不放,设$l_{i}$表示整个区间在当前点之前的最大的左端点。

这样子就有了转移方程:$f_{i} = max(f_{j}) + 1$  $(l_{i} \leq j \leq r_{i})$。

弄一个单调队列优化。

读入的时候读入了$x$和$y$,用$x - 1$更新$r_{y}$,用$x$更新$l_{y + 1}$。

有一点问题就是可能会出现$l$不严格不下降,$r$不严格不上升的情况,考虑到$l$, $r$的现实意义,所以处理完读入的时候扫一遍处理一下。

细节:

1、因为$f$表示必选的情况,那么可以让$f_{n + 1}$参与转移,如果$f_{n + 1}$合法,那么最后答案就是$f_{n + 1} - 1$。(我就是这样WA1次的)

2、把不合法的状态标记为$-1$,注意不合法的状态不参与转移。(我就是这样又WA了一次)

还是太菜了。

时间复杂度$O(n)$。

Code:

#include <cstdio>
#include <cstring>
using namespace std;; const int N = 2e5 + ; int n, m, ln[N], rn[N], q[N], f[N]; inline void read(int &X) {
X = ; char ch = ; int op = ;
for(; ch > ''|| ch < ''; ch = getchar())
if(ch == '-') op = -;
for(; ch >= '' && ch <= ''; ch = getchar())
X = (X << ) + (X << ) + ch - ;
X *= op;
} inline void chkMax(int &x, int y) {
if(y > x) x = y;
} inline void chkMin(int &x, int y) {
if(y < x) x = y;
} int main() {
// freopen("testdata.in", "r", stdin); read(n), read(m);
for(int i = ; i <= n + ; i++) rn[i] = i - ;
for(int x, y, i = ; i <= m; i++) {
read(x), read(y);
chkMin(rn[y], x - );
chkMax(ln[y + ], x);
} for(int i = n; i >= ; i--) chkMin(rn[i], rn[i + ]);
for(int i = ; i <= n; i++) chkMax(ln[i], ln[i - ]); int l = , r = , pos = ; q[] = ;
for(int i = ; i <= n + ; i++) {
for(; l <= r && q[l] < ln[i]; ++l);
if(l <= r) f[i] = f[q[l]] + ;
else f[i] = -;
for(; pos <= rn[i + ]; ++pos) {
if(f[pos] == -) continue;
for(; l <= r && f[q[l]] < f[pos]; --r);
q[++r] = pos;
}
} if(f[n + ] != -) f[n + ]--;
printf("%d\n", f[n + ]);
return ;
}

Luugu 3084 [USACO13OPEN]照片Photo的更多相关文章

  1. 洛谷3084 [USACO13OPEN]照片Photo

    原题链接 神仙\(DP\)啊... 题解请移步隔壁大佬的博客\(QAQ\) #include<cstdio> using namespace std; const int N = 2e5 ...

  2. 洛谷 P3084 [USACO13OPEN]照片Photo 解题报告

    [USACO13OPEN]照片Photo 题目描述 农夫约翰决定给站在一条线上的\(N(1 \le N \le 200,000)\)头奶牛制作一张全家福照片,\(N\)头奶牛编号\(1\)到\(N\) ...

  3. [USACO13OPEN]照片Photo

    题目描述 Farmer John has decided to assemble a panoramic photo of a lineup of his N cows (1 <= N < ...

  4. P3084 [USACO13OPEN]照片Photo (dp+单调队列优化)

    题目链接:传送门 题目: 题目描述 Farmer John has decided to assemble a panoramic photo of a lineup of his N cows ( ...

  5. P3084 [USACO13OPEN]照片Photo

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

  6. P3084 [USACO13OPEN]照片Photo dp

    题意: 有n个区间,每个区间只能有一个斑点奶牛,问最多有几个斑点奶牛. 思路: 首先要处理出每个点的L[i],R[i]. L[i]表示L[i]-i-1之间一定有一个点.i也是选中的. R[i]表示R[ ...

  7. [USACO13OPEN]照片Photo 题解

    题面 这道题似乎可以用单调队列优化DP做,但这里讲的是一种差分约束的思路; 设s[i]表示1~i中选了多少个: s[b[i]]-s[a[i]-1]<=1; s[b[i]]-s[a[i]-1]&g ...

  8. 【简●解】[USACO] 照片Photo

    [简●解][USACO] 照片Photo [题目大意] 在\(1\)~\(N\)的序列上有\(M\)个区间,使得这\(M\)个小区间每个覆盖了且仅覆盖了一个点,求最多点数,如果无解,输出\(-1\). ...

  9. P3084 [USACO13OPEN]照片(差分约束)

    (已经有了简化版题面) 又秒了一次dp233 本来按照感觉瞎写了一发... 但还是老老实实列式子吧.... 对差分约束有了更深的理解 #include<cstdio> #include&l ...

随机推荐

  1. Python数据分析_Pandas01_数据框的创建和选取

    主要内容: 创建数据表 查看数据表 数据表索引.选取部分数据 通过标签选取.loc 多重索引选取 位置选取.iloc 布尔索引 Object Creation 新建数据 用list建series序列 ...

  2. position属性详解

    内容: 1.position属性介绍 2.position属性分类 3.relative相对定位 4.absolute绝对定位 5.relative和absolute联合使用进行定位 6.fixed固 ...

  3. Configure First SpringMVC project in IntelliJ IDEA(fail)

    Configure First SpringMVC project in IntelliJ IDEA 13 The Mechanism of Spring MVC frameworks by Java ...

  4. python入门-字典

    1 python是使用{}来表示字典 字典是一系列的键值对 alien_0={} 2 访问字典中的值 new_point = alien_0['point'] print("you just ...

  5. sqlserver导入导出数据库结构及创建用户分配权限

    1.创建用户分配权限 https://www.cnblogs.com/jennyjiang-00/p/5803140.html 2.sqlserver2008导出表结构和表数据 导出表结构   htt ...

  6. rhel7配置yum的方法

    参考网站:https://www.cnblogs.com/haoyufeng/p/4393005.html rhel的版本号:::::::::: [root@LinuxS04 yum.repos.d] ...

  7. Redis 集合 set 操作, 有序集合

    01, 唯一性, 确定性, 无序性 ( 结合的三大特性 ) 02, 新建集合, 或者往集合中添加数据 => sadd key value1 value2 value3 ....... 03, 查 ...

  8. as3 分发事件无法接收

    最简单的.直接用舞台接收. 如: stage.addEventListener("ok",okH);

  9. UI5-文档-4.1-Hello World!

    如你所知,SAPUI5是关于HTML5的.让我们开始构建第一个仅使用HTML的“Hello World”. Preview 浏览器显示文本“Hello World” Coding 你可以在此查看和下载 ...

  10. 更改linux swappiness 提高物理内存使用率

    swappiness的值的大小对如何使用swap分区是有着很大的联系的. swappiness=0的时候表示最大限度使用物理内存,然后才是 swap空间,swappiness=100的时候表示积极的使 ...