[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的时间是多少,车如果挡到人,人就不能走. 题解: 这题当时以为计算几何,所以就没做 ...
随机推荐
- __metaclass__方法
metaclass这个属性叫做元类,它是用来表示这个类是由谁来帮他实例化创建的,说白了,就是相当于自己定制一个类. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 ...
- Linux在线安装MongoDB
Mongo官网安装地址: https://docs.mongodb.com/manual/tutorial/install-mongodb-on-red-hat/ 以MongoDB3.4为例 1.创建 ...
- 2019.11.9 csp-s 考前模拟
2019.11.9 csp-s 考前模拟 是自闭少女lz /lb(泪奔 T1 我可能(呸,一定是唯一一个把这个题写炸了的人 题外话: 我可能是一个面向数据编程选手 作为一个唯一一个写炸T1的人,成功通 ...
- python并发编程-多线程实现服务端并发-GIL全局解释器锁-验证python多线程是否有用-死锁-递归锁-信号量-Event事件-线程结合队列-03
目录 结合多线程实现服务端并发(不用socketserver模块) 服务端代码 客户端代码 CIL全局解释器锁****** 可能被问到的两个判断 与普通互斥锁的区别 验证python的多线程是否有用需 ...
- win10操作系统的安装
电脑被重装操作系统了,一切从头开始啦!!! 不过倒是学习了,给大家分享一些学习经验~ 1:制作启动盘 制作启动盘的首先要准备一个空的U盘,为什么说空的呢,因为制作的时候会格式化U盘,只能存个操作系统, ...
- 25个免费的jQuery/ JavaScript的图表和图形库
1. JS Charts Features Prepare your chart data in XML, JSON or JavaScript Array Create charts in dif ...
- spring cloud 入门
某种程度上 软硬件 殊途同归了 (软件模仿硬件 总线设计, 资源定位 (寻址) ) spring 是什么 EDA ( Event-driven architecture ) (SOA , SOAP , ...
- C++ Concurrency In Action 一些重点
全部来自于gitbook C++并发编程(中文版) 需要对一个还未销毁的std::thread对象使用join()或detach().如果想要分离一个线程,可以在线程启动后,直接使用detach() ...
- C++中写文件ofstream 的<< 操作符 与C风格的fwrite 的笔记
在某次工作中,调用了某SDK接口,该接口通过一个回调函数返回需要的内容.我们需要的内容是H.264码流,该码流通过一个unsigned char* 变量带回,另外还有一个长度 int length.为 ...
- tornada-基础
回想Django的部署方式 以Django为代表的python web应用部署时采用wsgi协议与服务器对接(被服务器托管),而这类服务器通常都是基于多线程的,也就是说每一个网络请求服务器都会有一个对 ...