bzoj 5185 Lifeguards - 动态规划 - 贪心
显然被包含的区间一定不优。再加上被包含的区间对计数不友好。直接把它删掉。
注意到题目说恰好,其实是骗人的。多删几个也不会影响(删太多了就有影响了)。
按照右端点排序,然后用$f[i][j]$表示考虑前$i$个区间,已经选了删掉$j$个。
考虑转移,第一种情况是第$i$个区间不选,直接通过$i - 1$转移。
第二种情况是要选$i$。然后要计算贡献。这时考虑上一个选择的是什么?
- 如果和第$i$个区间有相交,那么显然选择左端点最小的一个和当前区间相交的线段作为上一个。然后中间的线段全部删掉(因为它们被包含了。)。答案补上这个区间覆盖不到的但当前区间能够覆盖的地方。(如果上一个不是选的这个区间也无妨,因为这样一定没有下面这样的转移优)
- 否则从左端点最小的一个区间的前一个区间转移。答案加上当前区间长度。
Code
/**
* bzoj
* Problem#5185
* Accepted
* Time: 1140ms
* Memory: 43876k
*/
#include <bits/stdc++.h>
using namespace std;
typedef bool boolean; typedef class Segment {
public:
int l, r; boolean operator < (Segment b) const {
if (r ^ b.r) return r < b.r;
return l < b.l;
}
}Segment; const int N = 1e5 + , K = ; int n, m, k;
Segment* bs;
Segment* ss;
int f[N][K]; inline void init() {
scanf("%d%d", &n, &k);
bs = new Segment[(n + )];
ss = new Segment[(n + )];
for (int i = ; i <= n; i++)
scanf("%d%d", &bs[i].l, &bs[i].r);
} inline void solve() {
sort(bs + , bs + n + );
for (int i = ; i <= n; i++) {
if (i == || bs[i].r != bs[i - ].r)
ss[++m] = bs[i];
else
k--;
} int mil = (signed) (~0u >> );
n = ;
for (int i = m; i; i--) {
if (ss[i].l < mil)
bs[++n] = ss[i], mil = ss[i].l;
else
k--;
}
sort(bs + , bs + n + );
k = max(k, );
memset(f, 0x80, sizeof(f[]) * (m + ));
int p = ;
f[][] = ;
for (int i = ; i <= n; i++) {
while (p <= i && bs[p].r < bs[i].l)
p++;
assert(p <= i);
for (int j = ; j <= k; j++)
f[i][j] = max(f[i][j], f[i - ][j - ]);
f[i][k] = max(f[i][k], f[i - ][k]); for (int j = ; j <= k; j++) {
int cj = min(j + i - p - , k);
if (p ^ i)
f[i][cj] = max(f[i][cj], f[p][j] + bs[i].r - bs[p].r);
cj = min(cj + , k);
f[i][cj] = max(f[i][cj], f[p - ][j] + bs[i].r - bs[i].l);
}
}
printf("%d\n", f[n][k]);
} int main() {
init();
solve();
return ;
}
bzoj 5185 Lifeguards - 动态规划 - 贪心的更多相关文章
- BZOJ 1029 建筑抢修 贪心+堆
又搞了一晚上OI,编了两道BZOJ和几道NOI题库,临走之前写两篇感想 noip越来越近了,韩大和clove爷已经开始停课虐我们了... 1029: [JSOI2007]建筑抢修 Time Limit ...
- [bzoj 2151]种树(贪心)
题目:http://www.lydsy.com/JudgeOnline/problem.php?id=2151 分析:原型是bzoj 1150(CTSC 2007) 首先DP无法下手,想到贪心.想到贪 ...
- BZOJ.5397.circular(随机化 贪心)
BZOJ 感觉自己完全没做过环上选线段的问题(除了一个2-SAT),所以来具体写一写qwq. 基本完全抄自remoon的题解qwq... (下标从\(0\sim m-1\)) 拆环为链,对于原线段\( ...
- hdu 1257 最少拦截系统(动态规划 / 贪心)
最少拦截系统 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Subm ...
- 洛谷P1095守望者的逃离题解-伪动态规划/贪心
链接 题目描述 恶魔猎手尤迪安野心勃勃,他背叛了暗夜精灵,率领深藏在海底的娜迦族企图叛变.守望者在与尤迪安的交锋中遭遇了围杀,被困在一个荒芜的大岛上.为了杀死守望者,尤迪安开始对这个荒岛施咒,这座岛很 ...
- 二叉树遍历问题、时间空间复杂度、淘汰策略算法、lru数据结构、动态规划贪心算法
二叉树的前序遍历.中序遍历.后序遍历 前序遍历 遍历顺序规则为[根左右] ABCDEFGHK 中序遍历 遍历顺序规则为[左根右] BDCAEHGKF 后序遍历 遍历顺序规则为[左右根] DCBHKGF ...
- BZOJ.3252.攻略(贪心 长链剖分/线段树)
题目链接 贪心,每次选价值最大的一条到根的链.比较显然(不选白不选). 考虑如何维护这个过程.一个点的价值选了就没有了,而它只会影响它子树里的点,可以用DFS序+线段树修改.而求最大值也可以用线段树. ...
- BZOJ.4245.[ONTAK2015]OR-XOR(贪心)
题目链接 从高到低位贪心,判断答案的该位能否为0. 求一个前缀和sum.对于最高位,答案的这一位可以为0当且仅当至少存在m个位置满足sum[i]在这一位上为0. 注意sum[n]这一位必须为0. 如果 ...
- BZOJ 3143 游走(贪心+期望+高斯消元)
一个无向连通图,顶点从1编号到N,边从1编号到M. 小Z在该图上进行随机游走,初始时小Z在1号顶点,每一步小Z以相等的概率随机选 择当前顶点的某条边,沿着这条边走到下一个顶点,获得等于这条边的编号的分 ...
随机推荐
- ubuntu 14.04 安装python包psycopg2
http://stackoverflow.com/questions/28253681/you-need-to-install-postgresql-server-dev-x-y-for-buildi ...
- thymeleaf入门和学习
springboot框架不推荐使用jsp,一方面是兼容性的技术问题,一方面也是其前后端整合在一起,很难适合当下大规模的网站开发环境.HTML只是一种标记语言,并不具有获取model中数据的功能,所以视 ...
- Oracle数据库实例的启动及关闭
要启动和关闭数据库,必须要以具有Oracle 管理员权限的用户登陆,通常也就是以具有SYSDBA权限的用户登陆.一般我们常用SYS用户以SYSDBA连接来启动和关闭数据库.下面介绍Oracle数据库几 ...
- common lisp里的几个操作符
setf 赋值操作符,定义一个全局变量.返回值是最后一个赋值的结果. let 局部变量操作符.let表达式有两部分组成.第一部分是任意多的变量赋值,他们被包裹在一个()中,第二部分是任意数量的表示式 ...
- 利用mimikatz破解远程终端凭据,获取服务器密码
测试环境:windows 10 道友们应该碰到过管理在本地保存远程终端的凭据,凭据里躺着诱人的胴体(服务器密码),早已让我们的XX饥渴难耐了.但是,胴体却裹了一身道袍(加密),待老衲操起法器将其宽衣解 ...
- PYTHON SOCKET编程简介
原文地址: PYTHON SOCKET编程详细介绍 Python 提供了两个基本的 socket 模块. 第一个是 Socket,它提供了标准的 BSD Sockets API. 第二个是 Soc ...
- leetcode-Evaluate the value of an arithmetic expression in Reverse Polish Notation
leetcode 逆波兰式求解 Evaluate the value of an arithmetic expression in Reverse Polish Notation. Valid ope ...
- 四则运算第三次 PSP
- ES6 Map 与 Set
Map 对象 Map 对象保存键值对.任何值(对象或者原始值) 都可以作为一个键或一个值. Maps 和 Objects 的区别 一个 Object 的键只能是字符串或者 Symbols,但一个 Ma ...
- Spring Boot 2.0 新特性和发展方向
以Java 8 为基准 Spring Boot 2.0 要求Java 版本必须8以上, Java 6 和 7 不再支持. 内嵌容器包结构调整 为了支持reactive使用场景,内嵌的容器包结构被重构了 ...