[HG]走夜路 题解
前言
整个机房就我一个人在想动态规划。
想了半天发现一堆性质,结果由于DP中出现折线挂了。
题目描述
某NOIP普及组原题加强版。
\(Jim\) 非常怕黑,他有一个手电筒,设手电筒的电量上限为 \(T\) 。
\(Jim\) 回家的路上有 \((N + 1)\) 个充电站, \(0\) 是起点 \(N\) 是终点,
\(Jim\) 每走一个单位距离消耗一个单位的电量。
给出每个充电站到下一个充电站的距离 \(D\) ,以及冲单位电量的花费 \(P\) ,求整个旅途的最少花费。
P.S. 如果 \(Jim\) 无法保证全程 手电筒都亮着输出 \(-1\) 。
题解
有一个美妙的贪心。
对于当前 \(Jim\) 所在的点,
如果能走到 \(P\) 值比它小的充电站,就适量地充电并走到它,使走到第一个 \(P\) 值小于他的充电站时花费的钱最小;
如果走不到或找不到这样一个点就充满电,走到下一个充电站。
那么怎么找到第一个 \(P\) 值小于它的点呢,简单第使用二分加ST表即可。
时间复杂度为 \(\Theta(n\ logn)\)。
代码
#include <cstdio>
#define int long long
int st[500005][26];
int lg2[500005];
int d[500005], p[500005];
#define min(a,b) ((a<b)?a:b)
void init(int n){
lg2[1] = 0, lg2[2] = 1;
for (int i = 3; i <= n; ++i)
lg2[i] = lg2[i >> 1] + 1;
for (int i = 1; i <= n; ++i)
st[i][0] = p[i];
for (int i = 1; i <= 25; ++i){
int lim = n - (1 << i) + 1;
for (int j = 1; j <= lim; ++j)
st[j][i] = min(st[j][i - 1], st[j + (1 << i - 1)][i - 1]);
}
}
inline int query(int l, int r){
int i = lg2[r - l + 1];
return min(st[l][i], st[r - (1 << i) + 1][i]);
}
#define max(a,b) ((a>b)?a:b)
signed main(){
int n, t; scanf("%lld %lld", &n, &t);
for (int i = 1; i <= n; ++i)
scanf("%lld %lld", &d[i], &p[i - 1]), d[i] += d[i - 1];
init(n);
int pos = 0, eng = 0, cst = 0;
while (pos < n){
if (eng < 0){
puts("-1");
return 0;
}
int l = pos + 1, r = n, res = -1;
while (l <= r){
int mid = l + r >> 1;
if (query(pos + 1, mid) <= p[pos]) r = mid - 1, res = mid;
else l = mid + 1;
}
if (d[res] - d[pos] > t){
cst += (t - eng) * p[pos];
eng = t - (d[pos + 1] - d[pos]);
pos++;
}
else{
int tag = 0;
if (eng > d[res] - d[pos]) tag = eng - d[res] + d[pos];
cst += (d[res] - d[pos] - min(eng, d[res] - d[pos])) * p[pos];
eng = tag; pos = res;
}
}
printf("%lld", cst);
return 0;
}
[HG]走夜路 题解的更多相关文章
- 洛谷P1238 走迷宫题解
题目描述 有一个m*n格的迷宫(表示有m行.n列),其中有可走的也有不可走的,如果用1表示可以走,0表示不可以走,文件读入这m*n个数据和起始点.结束点(起始点和结束点都是用两个数据来描述的,分别表示 ...
- 【UR #7】水题走四方 题解
链接:http://uoj.ac/problem/84 20分算法:萌萌的小爆搜,别搜进环里就行. 50分:我们考虑一下最优决策是什么样的.看似很显然的一点就是我们先让本体在原地不动,让分身去遍历子树 ...
- [HG]子树问题 题解
前言 模拟赛赛时SubtaskR3没开long long丢了20分. 题意简述 题目描述 对于一棵有根树(设其节点数为 \(n\) ,则节点编号从 \(1\) 至 \(n\) ),如果它满足所有非根节 ...
- [HG]腿部挂件 题解
前言 暴力跑的比正解快. 以下暴力(循环展开+fread读入输出优化) #include<cstdio> #pragma GCC optimize(3, "Ofast" ...
- [HG]提高组 题解
首先很容易想到暴力DP 设状态f[i][j]表示当前放了第i个数,最大的数为j的方案数. 然后根据转移推出实际上是在下图走路的方案数 \[ \left( \left( \begin{matrix} x ...
- HGOI 20191030am 题解
Problem A 腿部挂件 给出$n$个数的序列$a_i$,支持$T$次操作. 每次操作形如$x , l , r$,计算$\max_{i = l}^{r} (a_i \oplus x)$的值. 对于 ...
- Codeforces 刷水记录
Codeforces-566F 题目大意:给出一个有序数列a,这个数列中每两个数,如果满足一个数能整除另一个数,则这两个数中间是有一条边的,现在有这样的图,求最大联通子图. 题解:并不需要把图搞出来, ...
- durex-word
"(半夜没睡着) “你是不是饿了,哎呀我也饿了.”" "(聊到合拍处) “我和你有一万句me too想要说.”" "(异地恋) “我辞职,去你那儿吧! ...
- Codeforces Round #365 (Div. 2) Chris and Road
Chris and Road 题意: 给一个n个顶点的多边形的车,有速度v,人从0走到对面的w,人速度u,问人最快到w的时间是多少,车如果挡到人,人就不能走. 题解: 这题当时以为计算几何,所以就没做 ...
随机推荐
- .Net Core使用AutoMapper做对象关系映射
我想很多后端开发者,纠结于如何在Dto及表实体中做属性关系映射,因为真的太繁琐了., ⒈如何使用? Mapper.Initialize(cfg => cfg.CreateMap<Users ...
- P1828香甜的黄油
这是一道关于最短路的绿题. 题目给出一些农场,每个农场有奶牛,农场与农场之间存在边,要使所有奶牛到达其中一个农场的总距离最短,输出他们到达这个农场的距离.首先我想到了最小生成树,但我发现其实并不是,因 ...
- 如何用纯 CSS 创作六边形按钮特效
效果预览 在线演示 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/xjoOeM 可交互视频教 ...
- 【Java】Java程序报错:EXCEPTION_ACCESS_VIOLATION (0xc0000005)
运行Java程序的时候,报错:EXCEPTION_ACCESS_VIOLATION (0xc0000005): 根据原网页的说明: EXCEPTION_ACCESS_VIOLATION In rare ...
- Spring的基本应用(1):依赖以及控制反转
在说到这里的时候,首先要说下程序的耦合和解耦,以便对上节做一个解释. 一.程序的耦合和解耦 1.程序的耦合性(Copling) (1)程序的耦合性,也叫做耦合度,是对模块之间关联程度的度量,耦合性的强 ...
- Go项目目录管理
在Go的官网文档How to Write Go Code中,已经介绍了Go的项目目录一般包含以下几个: src 包含项目的源代码文件: pkg 包含编译后生成的包/库文件: bin 包含编译后生成的可 ...
- Java缓存要点
1.缓存一般是这样的:先查缓存,查不到就查DB,如果DB查不到就结束,DB查到了就写入缓存. 如果用户一直在大量地查询不存在的数据,则所有的请求都会落到DB,而且没有数据写入缓存. 解决方法:把查不到 ...
- shell脚本中的日期处理
Ps:这篇文章只是为了做个分类,以后有看到比较好的时间处理命令都会列在这里,您如果有什么好的时间处理命令,可以评论中添加,我会定期查看更新,谢谢! 1.定义一个参数DATE_TODAY,用于记录当天时 ...
- DHCP服务部署
目录 DHCP服务部署 一. 简介 二. 用途及功能 三. 原理+示意图 四. 实战搭建 相关文件 配置基础DHCP服务器 配置DHCP保留地址 配置DHCP超级作用域 配置DHCP中继 五. 小结 ...
- MyEclipse_10.7安装及破解
MyEclipse_10.7 0.解压文件如下两图操作:1.运行安装程序,双击myeclipse-10.7-offline-installer-windows.exe进入安装界面,下一步:2.同意协议 ...