Luugu 3084 [USACO13OPEN]照片Photo
很神仙的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的更多相关文章
- 洛谷3084 [USACO13OPEN]照片Photo
原题链接 神仙\(DP\)啊... 题解请移步隔壁大佬的博客\(QAQ\) #include<cstdio> using namespace std; const int N = 2e5 ...
- 洛谷 P3084 [USACO13OPEN]照片Photo 解题报告
[USACO13OPEN]照片Photo 题目描述 农夫约翰决定给站在一条线上的\(N(1 \le N \le 200,000)\)头奶牛制作一张全家福照片,\(N\)头奶牛编号\(1\)到\(N\) ...
- [USACO13OPEN]照片Photo
题目描述 Farmer John has decided to assemble a panoramic photo of a lineup of his N cows (1 <= N < ...
- P3084 [USACO13OPEN]照片Photo (dp+单调队列优化)
题目链接:传送门 题目: 题目描述 Farmer John has decided to assemble a panoramic photo of a lineup of his N cows ( ...
- P3084 [USACO13OPEN]照片Photo
题目描述 农夫约翰决定给站在一条线上的N(1 <= N <= 200,000)头奶牛制作一张全家福照片,N头奶牛编号1到N. 于是约翰拍摄了M(1 <= M <= 100,00 ...
- P3084 [USACO13OPEN]照片Photo dp
题意: 有n个区间,每个区间只能有一个斑点奶牛,问最多有几个斑点奶牛. 思路: 首先要处理出每个点的L[i],R[i]. L[i]表示L[i]-i-1之间一定有一个点.i也是选中的. R[i]表示R[ ...
- [USACO13OPEN]照片Photo 题解
题面 这道题似乎可以用单调队列优化DP做,但这里讲的是一种差分约束的思路; 设s[i]表示1~i中选了多少个: s[b[i]]-s[a[i]-1]<=1; s[b[i]]-s[a[i]-1]&g ...
- 【简●解】[USACO] 照片Photo
[简●解][USACO] 照片Photo [题目大意] 在\(1\)~\(N\)的序列上有\(M\)个区间,使得这\(M\)个小区间每个覆盖了且仅覆盖了一个点,求最多点数,如果无解,输出\(-1\). ...
- P3084 [USACO13OPEN]照片(差分约束)
(已经有了简化版题面) 又秒了一次dp233 本来按照感觉瞎写了一发... 但还是老老实实列式子吧.... 对差分约束有了更深的理解 #include<cstdio> #include&l ...
随机推荐
- python的动态性和_slot_
python是动态语言 1. 动态语言的定义 动态编程语言 是 高级程序设计语言 的一个类别,在计算机科学领域已被广泛应用.它是一类 在运行时可以改变其结构的语言 :例如新的函数.对象.甚至代码可以被 ...
- angular 获取当前值
- leetcode929
package main import ( "fmt" "strings" ) func numUniqueEmails(emails []string) in ...
- require.js 学习基础
RequireJS 是一个JavaScript模块加载器,他的目标是鼓励代码的模块化,它使用了不同于传统<script>标签的脚本加载步骤.可以用它来加速.优化代码,但其主要目的还是为了代 ...
- java 项目中类找不到异常解决办法
最后点击Apply and Close就可以了
- Django之 Model Field Options
以下这些选项都是可选择的,非固定要求. 1)null,注意在CharField或者TextField里避免使用null,因为其存储的值是空字符串而不是NULL 2)blank该字段是否可以为空.如果为 ...
- python: no module named bz2
https://stackoverflow.com/questions/8115280/importerror-no-module-named-bz2-for-python-2-7-2 centos6 ...
- TensorFlow入门-Tianic数据集训练
import pandas as pd import tensorflow as tf from sklearn.model_selection import train_test_split imp ...
- struts2,servlet和springmvc的单例多例问题
struts2,servlet和springmvc的单例多例问题 原创 2017年06月12日 09:59:21 标签: struts2 / servlet / springmvc / 单例 / 多例 ...
- jstatd - Virtual Machine jstat Daemon
jstatd [options] 参数:options 命令行参数,可以按任何顺序,但如果有多余的或者中有互斥的参数,最后制定的那个参数将有优先权 options: -nr 当一个存在的RMI Reg ...