pid=5380">题目链接:hdu 5380 Travel with candy

保持油箱一直处于满的状态,维护一个队列,记录当前C的油量中分别能够以多少价格退货,以及能够推货的量。每到一个位置,能够该商店的sell值更新队列中全部价格小于sell的(还没有卖)。

用buy值更新队列中大于buy(卖掉了)。移动所消耗的油从价格最低的開始。

#include <cstdio>
#include <cstring>
#include <algorithm> using namespace std;
typedef long long ll;
const int maxn = 2 * 1e5 + 5; ll ans;
int N, C, L, R, D[maxn], S[maxn], B[maxn], W[maxn * 2], V[maxn * 2]; void init () {
scanf("%d%d", &N, &C);
for (int i = 1; i <= N; i++)
scanf("%d", &D[i]);
for (int i = 0; i <= N; i++)
scanf("%d%d", &B[i], &S[i]);
} void merge(int s) {
int v = 0;
while (L <= R && W[L] <= s)
v += V[L++]; if (v) {
W[--L] = s;
V[L] = v;
}
} int sell (int s) {
int ret = 0;
while (L <= R && W[R] >= s) {
ans -= 1LL * V[R] * W[R];
ret += V[R--];
}
return ret;
} void consume(int v) {
while (v) {
int k = min(V[L], v);
v -= k;
V[L] -= k;
if (V[L] == 0)
L++;
}
} void solve () {
ans = 0;
L = N, R = N - 1;; for (int i = 0; i < N; i++) {
merge(S[i]);
int add = (i == 0 ? C : D[i] - D[i-1]);
add += sell(B[i]);
W[++R] = B[i];
V[R] = add;
ans += 1LL * B[i] * add;
consume(D[i+1] - D[i]);
}
merge(S[N]);
while (L <= R) {
ans -= 1LL * W[L] * V[L];
L++;
}
} int main () {
int cas;
scanf("%d", &cas);
while (cas--) {
init ();
solve ();
printf("%lld\n", ans);
}
return 0;
}

hdu 5380 Travel with candy(双端队列)的更多相关文章

  1. HDU - 6386 Age of Moyu (双端队列+bfs)

    题目链接 双端队列跑边,颜色相同的边之间的花费为0,放进队首:不同的花费为1,放进队尾. 用Dijkstra+常数优化也能过 #include<bits/stdc++.h> using n ...

  2. HDU 5380 Travel with candy 单调队列

    pid=5380">链接 题解链接:http://www.cygmasot.com/index.php/2015/08/16/hdu_5380 题意: n C 一条数轴上有n+1个加油 ...

  3. HDU 5380 Travel with candy (贪心,单调队列)

    题意: 有n+1个城市按顺序分布在同一直线上,现在需从0号城市按顺序走到n号城市(保证可达),从0号城市到i号城市需要消耗ai个糖果,每个城市都可以通过买/卖糖果来赚取更多的钱,价格分别是buyi和s ...

  4. HDU 6319 Ascending Rating (单调双端队列)

    题意:给定一个序列a[1..n],对于每个长度为m的连续子区间,求出区间的最大值和从左往右扫描该区间最大值的变化次数. 分析:先O(n)处理出整个序列的值.求出每个长度为m的连续区间中的最大值可以用单 ...

  5. HDU 4286 Data Handler --双端队列

    题意:有一串数字,两个指针,然后一些添加,删除,反转,以及移动操作,最后输出序列. 解法:可以splay做,但是其实双端队列更简便. 维护三个双端队列LE,MI,RI分别表示[L,R]序列左边,[L, ...

  6. HDU 6375(双端队列 ~)

    题意是有至多150000个双端队列,400000次简单操作,直接开会导致内存超限,所以用 STL 中的 map 和 deque ,而读入过大已经在题目中有所说明,直接用已经给出的快速读入即可.要注意的 ...

  7. lintcode二叉树的锯齿形层次遍历 (双端队列)

    题目链接: http://www.lintcode.com/zh-cn/problem/binary-tree-zigzag-level-order-traversal/ 二叉树的锯齿形层次遍历 给出 ...

  8. lintcode 滑动窗口的最大值(双端队列)

    题目链接:http://www.lintcode.com/zh-cn/problem/sliding-window-maximum/# 滑动窗口的最大值 给出一个可能包含重复的整数数组,和一个大小为  ...

  9. STL---deque(双端队列)

    Deque是一种优化了的.对序列两端元素进行添加和删除操作的基本序列容器.它允许较为快速地随机访问,但它不像vector 把所有的对象保存在一块连续的内存块,而是采用多个连续的存储块,并且在一个映射结 ...

随机推荐

  1. NOIp2018模拟赛三十三

    神奇的一场... 成绩:100+0+14=114 A题是个体面很恐怖的题...然而看懂题意之后转化一下就变成了一道暴力傻逼题...但是不知道为什么dalao们都没写,讲题的时候挺尴尬的...yrx“瞄 ...

  2. Vue中两种传值方式

    第一种:通过url传参,直接在地址后加? ,通过this.$route.query对象获取 第二种:通过路由传参,修改路由,通过this.$route.params对象获取

  3. js Date() 时间函数处理 关于 toLocaleDateString()

    toLocaleDateString()方法的真正含义为「根据本地时间把Date对象的日期部分转换为字符串」,这意味着:在不同的浏览器或者服务器中,我们可能得到不同的字符串. 例如,将 Chrome ...

  4. HDU-1358 Period 字符串问题 KMP算法 求最小循环节

    题目链接:https://cn.vjudge.net/problem/HDU-1358 题意 给一个字符串,对下标大于2的元素,问有几个最小循环节 思路 对每个元素求一下minloop,模一下就好 提 ...

  5. Java默认方法

    示例1 interface InterfaceA { default void say() { System.out.println("InterfaceA"); } } publ ...

  6. 安装 glusterfs yum源报错

    yum install glusterfs-server yum 一直报错 把/etc/yum.repos.d 备份 删除了所有文件,从测试机192..168.59.128上同步过来 一直报错 已加载 ...

  7. c++PrimerChap7类

    仅仅记录贴,按书上的做完了一边,想把private分离出来已经很难了.因为is用到的成员变量都是直接当做public使用的,如果要改的话可以考虑存储输入,让后用构造函数对类进行初始化. #includ ...

  8. P2899 [USACO08JAN]手机网络Cell Phone Network

    P2899 [USACO08JAN]手机网络Cell Phone Networ题目描述 Farmer John has decided to give each of his cows a cell ...

  9. linux搜索文件过程

    1.文件里的数据是放在磁盘的数据区中的,而一个文件名称则是通过相应的i节点与这些磁盘块联系起来.这些盘块的号码就存放在i节点的逻辑块数组i_zone[]中.在文件系统的一个文件夹中,当中全部文件名称信 ...

  10. CSS中的相关概念

    CSS的几个概念: 包括块:一个元素的"布局上下文".对于正常的HTML文本流中的一个元素,包括块由近期的块级祖先框.表单元格或行内块祖先框的内容边界(content edge)构 ...