Codeforces 721E Road to Home
题意
输入第一行有4个数,分别为\(L,n,p,t\),分别表示总长度为\(L\)的路,中间有\(n\)个互不相交的区间,现在要用长度为\(p\)的小木棒从左往右铺路(木棒不能被折断,也不能有重叠,且所有的木棒必须在区间内),你可以连续铺路,但是一旦你主动或被迫中断铺路(比如区间内剩下的长度不足以放下一根木棍)那么下一根开铺的木棍最少也要在\(t\)距离之后。问最多能铺多少根木棍。接下来的\(n\)行表示从左到右的\(n\)个区间。
想法
首先当然是想暴力的算法...dp?
\(f_i\)表示铺完前\(i\)个区间最多能铺的木棍数,\(g_i\)表示前\(i\)个区间铺了最多的木棍时最右端的木棍的右端最左可以取到的地方。
暴力转移?
\]
\]
之后由观察/打表可以发现,\(g_i\)是不减的,决策也是不减的,那么这就可以用到“单调队列”。
每次转移时不断从队头取出元素,如果有更优的决策那么就从队头pop出去,更新了就把得到的状态加入到队尾。
注意这里的更优不仅要考虑\(f_i\)的更大,在\(f_i\)相同时也要考虑\(g_i\)的更小。
Code
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#define ll long long
#define db double
#define N 100010
#define max(a, b) ((a) > (b) ? (a) : (b))
#define min(a, b) ((a) < (b) ? (a) : (b))
#define swap(T, a, b) ({T ttt = a; a = b; b = ttt;})
#define x f[q[tl]]
#define y g[q[tl]]
int L, n, p, t, f[N], g[N], l[N], r[N], Ans = 0, q[N], tl, tr, tA, tB;
bool Q;
int main()
{
scanf("%d%d%d%d", &L, &n, &p, &t);
for (int i = 1; i <= n; i++)
scanf("%d%d", &l[i], &r[i]);
f[0] = 0; g[0] = -t; q[tl = tr = 0] = 0;
for (int i = 1; i <= n; i++)
{
tA = tB = 0; Q = false;
while (tl <= tr && y + t <= r[i] && x + (r[i] - max(l[i], y + t)) / p > tA)
{
tA = x + (r[i] - max(l[i], y + t)) / p;
tl++; Q = true;
}
if (Q) tl--;
else tA = x + (r[i] - max(l[i], y + t)) / p;
tB = max(l[i], y + t) + (r[i] - max(l[i], y + t)) / p * p;
Q = false;
while (tl <= tr && y + t <= r[i] && x + (r[i] - max(l[i], y + t)) / p == tA)
{
tB = min(tB, max(l[i], y + t) + (r[i] - max(l[i], y + t)) / p * p);
tl++; Q = true;
}
if (Q) tl--;
f[i] = tA; g[i] = tB;
if (f[i] > Ans) { Ans = f[i]; q[++tr] = i; }
}
printf("%d\n", Ans);
return 0;
}
Codeforces 721E Road to Home的更多相关文章
- Codeforces 543D. Road Improvement (树dp + 乘法逆元)
题目链接:http://codeforces.com/contest/543/problem/D 给你一棵树,初始所有的边都是坏的,要你修复若干边.指定一个root,所有的点到root最多只有一个坏边 ...
- Codeforces 543D Road Improvement
http://codeforces.com/contest/543/problem/D 题意: 给定n个点的树 问: 一开始全是黑边,对于以i为根时,把树边白染色,使得任意点走到根的路径上不超过一条黑 ...
- Codeforces 702D Road to Post Office(模拟 + 公式推导)
题目链接:http://codeforces.com/problemset/problem/702/D 题意: 一个人要去邮局取东西,从家到达邮局的距离为 d, 它可以选择步行或者开车,车每走 k 公 ...
- Codeforces 240E. Road Repairs 最小树形图+输出路径
最小树形图裸题,只是须要记录路径 E. Road Repairs time limit per test 2 seconds memory limit per test 256 megabytes i ...
- Codeforces 729C Road to Cinema(二分)
题目链接 http://codeforces.com/problemset/problem/729/C 题意:n个价格c[i],油量v[i]的汽车,求最便宜的一辆使得能在t时间内到达s,路途中有k个位 ...
- Codeforces 543D Road Improvement(树形DP + 乘法逆元)
题目大概说给一棵树,树的边一开始都是损坏的,要修复一些边,修复完后要满足各个点到根的路径上最多只有一条坏的边,现在以各个点为根分别求出修复边的方案数,其结果模1000000007. 不难联想到这题和H ...
- Codeforces 543D Road Improvement(DP)
题目链接 Solution 比较明显的树形DP模型. 首先可以先用一次DFS求出以1为根时,sum[i](以i为子树的根时,满足要求的子树的个数). 考虑将根从i变换到它的儿子j时,sum[i]产生的 ...
- CodeForces 702D Road to Post Office
答案的来源不外乎于3种情况: 纯粹走路,用时记为${t_1}$:纯粹乘车,用时记为${t_2}$:乘车一定距离,然后走路,用时记为${t_3}$. 但是${t_1}$显然不可能成为最优解. 前两个时间 ...
- [Codeforces 1016F]Road Projects
Description 题库链接 给你一棵 \(n\) 个节点的树,定义 \(1\) 到 \(n\) 的代价是 \(1\) 到 \(n\) 节点间的最短路径的长度.现在给你 \(m\) 组询问,让你添 ...
随机推荐
- mac 关闭&&显示隐藏文件命令
打开终端,输入: defaults write com.apple.finder AppleShowAllFiles -bool true 此命令显示隐藏文件 defaults write com.a ...
- C++中的vector 用法解析
一.概述 vector 是C++标准模板库的部分内容,他是一个多功能的,能够操作多种 数据结构和算法 的模板类和函数库. vector 是一个容器,它能够存放各种类型的对象, ...
- Ubuntu Server 14.04 --secure-file-priv error in MySql 解决方案
在VPS部署Ubuntu 14.04服务器时,MySQL执行导出文件命令,报错: The MySQL server is running with the --secure-file-priv opt ...
- python之路十三
前景介绍 到目前为止,很多公司对堡垒机依然不太感冒,其实是没有充分认识到堡垒机在IT管理中的重要作用的,很多人觉得,堡垒机就是跳板机,其实这个认识是不全面的,跳板功能只是堡垒机所具备的功能属性中的其中 ...
- springmvc+mybatis事务回滚
spring-mybatis.xml中 配置了 <!-- 拦截器方式配置事物 --> <tx:advice id="transactionAdvice" tran ...
- Mybatis批量操作
首先,mysql需要数据库连接配置&allowMultiQueries=true jdbc:mysql://127.0.0.1:3306/mybank?useUnicode=true& ...
- [iOS]创建一像素的线
float sortaPixel = 1.0/[UIScreen mainScreen].scale; UIView* line = [[UIView alloc]initWithFrame:CGRe ...
- 关于Vue vuex vux 文档
01. vue 链接 http://vuejs.org.cn/guide/ 02. vuex ----->>状态管理模块儿<<------- https://vuex.vue ...
- sh5.while 脚本练习
脚本编程: 顺序结构 选择结构 if, case 循环结构 for,while,until while循环:适用于循环次数未知的场景 语法: while CONDITION;do statement ...
- myeclipse中如何修改项目的名称
第一种:myeclipse通用版 1.打比方,比如复制一个现有的项目,重命名项目名称,这里举例名称重新命名为"劳黑炭" 2.要清楚的是,这里的项目名称重新命名了,但是Web项目本 ...