好久没出去旅游啦!森森决定去 Z 省旅游一下。

Z 省有 n 座城市(从 1 到 n 编号)以及 m 条连接两座城市的有向旅行线路(例如自驾、长途汽车、火车、飞机、轮船等),每次经过一条旅行线路时都需要支付该线路的费用(但这个收费标准可能不止一种,例如车票跟机票一般不是一个价格)。

Z 省为了鼓励大家在省内多逛逛,推出了旅游金计划:在 i 号城市可以用 1 元现金兑换 ai 元旅游金(只要现金足够,可以无限次兑换)。城市间的交通即可以使用现金支付路费,也可以用旅游金支付。具体来说,当通过第 j 条旅行线路时,可以用 cj 元现金或 dj 元旅游金支付路费。注意: 每次只能选择一种支付方式,不可同时使用现金和旅游金混合支付。但对于不同的线路,旅客可以自由选择不同的支付方式。

森森决定从 1 号城市出发,到 n 号城市去。他打算在出发前准备一些现金,并在途中的某个城市将剩余现金 全部 换成旅游金后继续旅游,直到到达 n 号城市为止。当然,他也可以选择在 1 号城市就兑换旅游金,或全部使用现金完成旅程。

Z 省政府会根据每个城市参与活动的情况调整汇率(即调整在某个城市 1 元现金能换多少旅游金)。现在你需要帮助森森计算一下,在每次调整之后最少需要携带多少现金才能完成他的旅程。

输入格式:
输入在第一行给出三个整数 n,m 与 q(1≤n≤105​,1≤m≤2×105,1≤q≤105),依次表示城市的数量、旅行线路的数量以及汇率调整的次数。

接下来 m 行,每行给出四个整数 u,v,c 与 d(1≤u,v≤n,1≤c,d≤109),表示一条从 u 号城市通向 v 号城市的有向旅行线路。每次通过该线路需要支付 c 元现金或 d 元旅游金。数字间以空格分隔。输入保证从 1 号城市出发,一定可以通过若干条线路到达 n 号城市,但两城市间的旅行线路可能不止一条,对应不同的收费标准;也允许在城市内部游玩(即 u 和 v 相同)。

接下来的一行输入 n 个整数 a1,a2,⋯,an(1≤ai≤109),其中 ai表示一开始在 i 号城市能用 1 元现金兑换 ai个旅游金。数字间以空格分隔。

接下来 q 行描述汇率的调整。第 i 行输入两个整数 xi 与 ai′(1≤xi≤n,1≤a
​i′ ≤109),表示第 i 次汇率调整后,xi号城市能用 1 元现金兑换 ai′个旅游金,而其它城市旅游金汇率不变。请注意:每次汇率调整都是在上一次汇率调整的基础上进行的。

输出格式:
对每一次汇率调整,在对应的一行中输出调整后森森至少需要准备多少现金,才能按他的计划从 1 号城市旅行到 n 号城市。

再次提醒:如果森森决定在途中的某个城市兑换旅游金,那么他必须将剩余现金全部、一次性兑换,剩下的旅途将完全使用旅游金支付。

输入样例:
6 11 3
1 2 3 5
1 3 8 4
2 4 4 6
3 1 8 6
1 3 10 8
2 3 2 8
3 4 5 3
3 5 10 7
3 3 2 3
4 6 10 12
5 6 10 6
3 4 5 2 5 100
1 2
2 1
1 17

输出样例:
8
8
1

样例解释:
对于第一次汇率调整,森森可以沿着 1→2→4→6 的线路旅行,并在 2 号城市兑换旅游金;

对于第二次汇率调整,森森可以沿着 1→2→3→4→6 的线路旅行,并在 3 号城市兑换旅游金;

对于第三次汇率调整,森森可以沿着 1→3→5→6 的线路旅行,并在 1 号城市兑换旅游金。

分析:主体思路是,用Dijskra最短路算法分别算出:
1.使用现金从城市1出发,到达所有城市的最小花费(储存在cashD内)
2.使用旅游金从城市n出发,到达所有城市的最小花费(储存在voucherD内)
这样我们就能通过枚举中转点的方式,得到在第i个城市将现金换成旅游金的情况下所需要的现金总额~就是使用从城市1到达第i个城市所需要的最小现金数 + 从第i个城市到城市n所需要的最小旅游金数所转换成的现金数量,就可以得到在第i个城市兑换所需要的总现金费用,储存在tran[i]内~
huan[i]中储存第i个城市的汇率,cashE[i]和voucherE[i]中储分别储存使用现金和旅游金到达i可下一个城市的花费。最后将所有中转点所要用的花费储存在一个可以有重复值的multiset容器 minCost 中。最后在更新汇率时,将更新前花费从 minCost 中删除,并插入新值,然后输出 minCost 中的最小值就是答案啦~

注意:如果某点使用现金或旅游金不可达,那么该点的tran值则设置为0,在更新时该点也无需操作~

#include <bits/stdc++.h>
using namespace std;
#define pil pair<int, long long>
struct node {int id;long long dis;friend int operator < (const node &a, const node &b) {return a.dis > b.dis;}
};
int n, m, q, u, v, xi, vis1[100005], vis2[100005];
long long c, d, w, ai, huan[100005], cashD[100005], voucherD[100005], tran[100005];
vector<pil> cashE[100005], voucherE[100005];
multiset<long long> minCost;
priority_queue<node> Q;
void Dijskra (int s, vector<pil> E[], long long Dis[], int Vis[]) {fill (Dis + 1, Dis + n + 1, LLONG_MAX);Dis[s] = 0;Q.push(node{s, 0});while (!Q.empty()) {int now = Q.top().id;Q.pop();if (Vis[now]) continue;Vis[now] = 1;for (int i = 0; i < (int)E[now].size(); ++i) {v = E[now][i].first;w = E[now][i].second;if (Dis[v] > Dis[now] + w) {Dis[v] = Dis[now] + w;Q.push(node{v, Dis[v]});}}}
}
int main() {scanf("%d%d%d", &n, &m, &q);for (int i = 0; i < m; i++) {scanf("%d%d%lld%lld", &u, &v, &c, &d);cashE[u].push_back({v, c});voucherE[v].push_back({u, d});}for (int i = 1; i <= n; i++) scanf("%lld", &huan[i]);Dijskra(1, cashE, cashD, vis1);Dijskra(n, voucherE, voucherD, vis2);for (int i = 1; i <= n; i++) {if (cashD[i] == LLONG_MAX || voucherD[i] == LLONG_MAX) continue;minCost.insert(tran[i] = cashD[i] + (voucherD[i]+huan[i]-1) / huan[i]);}for (int i = 0; i < q; i++) {scanf("%d%lld", &xi, &ai);if (!tran[xi] || huan[xi] == ai) {printf("%lld\n", *minCost.begin());} else {minCost.erase(minCost.find(tran[xi]));huan[xi] = ai;minCost.insert(tran[xi] = cashD[xi]+(voucherD[xi]+huan[xi]-1)/huan[xi]);printf("%lld\n", *minCost.begin());}}return 0;
}

L3-028 森森旅游 (30 分)-PAT 团体程序设计天梯赛 GPLT相关推荐

  1. L3-017 森森快递 (30 分)-PAT 团体程序设计天梯赛 GPLT

    森森开了一家快递公司,叫森森快递.因为公司刚刚开张,所以业务路线很简单,可以认为是一条直线上的N个城市,这些城市从左到右依次从0到(N−1)编号.由于道路限制,第i号城市(i=0,⋯,N−2)与第(i ...

  2. L3-011 直捣黄龙 (30 分)-PAT 团体程序设计天梯赛 GPLT

    本题是一部战争大片 -- 你需要从己方大本营出发,一路攻城略地杀到敌方大本营.首先时间就是生命,所以你必须选择合适的路径,以最快的速度占领敌方大本营.当这样的路径不唯一时,要求选择可以沿途解放最多城镇 ...

  3. L3-012 水果忍者 (30 分)-PAT 团体程序设计天梯赛 GPLT

    2010年风靡全球的"水果忍者"游戏,想必大家肯定都玩过吧?(没玩过也没关系啦~)在游戏当中,画面里会随机地弹射出一系列的水果与炸弹,玩家尽可能砍掉所有的水果而避免砍中炸弹,就可以 ...

  4. L3-022 地铁一日游 (30 分)-PAT 团体程序设计天梯赛 GPLT

    森森喜欢坐地铁.这个假期,他终于来到了传说中的地铁之城--魔都,打算好好过一把坐地铁的瘾! 魔都地铁的计价规则是:起步价 2 元,出发站与到达站的最短距离(即计费距离)每 K 公里增加 1 元车费. ...

  5. L3-021 神坛 (30 分)-PAT 团体程序设计天梯赛 GPLT

    在古老的迈瑞城,巍然屹立着 n 块神石.长老们商议,选取 3 块神石围成一个神坛.因为神坛的能量强度与它的面积成反比,因此神坛的面积越小越好.特殊地,如果有两块神石坐标相同,或者三块神石共线,神坛的面 ...

  6. L3-020 至多删三个字符 (30 分)-PAT 团体程序设计天梯赛 GPLT

    给定一个全部由小写英文字母组成的字符串,允许你至多删掉其中 3 个字符,结果可能有多少种不同的字符串? 输入格式: 输入在一行中给出全部由小写英文字母组成的.长度在区间 [4, 106] 内的字符串. ...

  7. L3-016 二叉搜索树的结构 (30 分)-PAT 团体程序设计天梯赛 GPLT

    二叉搜索树或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值:若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值:它的左.右子树也分别 ...

  8. L3-009 长城 (30 分)-PAT 团体程序设计天梯赛 GPLT

    正如我们所知,中国古代长城的建造是为了抵御外敌入侵.在长城上,建造了许多烽火台.每个烽火台都监视着一个特定的地区范围.一旦某个地区有外敌入侵,值守在对应烽火台上的士兵就会将敌情通报给周围的烽火台,并迅 ...

  9. L3-006 迎风一刀斩 (30 分)-PAT 团体程序设计天梯赛 GPLT

    迎着一面矩形的大旗一刀斩下,如果你的刀够快的话,这笔直一刀可以切出两块多边形的残片.反过来说,如果有人拿着两块残片来吹牛,说这是自己迎风一刀斩落的,你能检查一下这是不是真的吗? 注意摆在你面前的两个多 ...

最新文章

  1. C#学习日志 day 5 plus------ interface 数组及stringBuilder相关
  2. 最新版idea如何在包下建立子包(dao包下建立impl包)
  3. IOS基础基于pod上手体验FMDB框架
  4. java输出不同颜色_Java设计模式-策略模式、状态模式
  5. .Net 2.0 文档生成工具
  6. tf.keras data
  7. 数据库主从数据一致性的几种解决方案
  8. 缺页异常(Page Faults) 和 Kernel Oops打印调用流程
  9. 离散数学 (II) 习题 2
  10. JavaWeb 自制基础开发框架准备环境搭建
  11. Python编程实现预剪枝的CART决策树
  12. 操作系统实现IO的三种方式
  13. 搜索引擎技术 ——链接分析
  14. PCB各层的用途和含义
  15. MFC错误0xc000007b 应用程序无法正常启动 的一种原因
  16. 学习QT之图形视图实例#-飞舞的蝴蝶
  17. 忘记网站登录密码不要慌,一招拯救你
  18. DEBUG系列二:ConfigureDebuggerLayer_SAP刘梦_新浪博客
  19. 在 Linux 上搭建 Hubot 聊天机器人服务器
  20. 论文:SOLO: Segmenting Objects by Locations

热门文章

  1. 编译源码时出现 Checking API: checkapi-last (unknown): error 17解决方法
  2. Android调用系统发送短信界面
  3. SingToken全球首款区块链智能AI音乐钱包
  4. Linux基础命令--grep/find
  5. 四种方法下载网络文本数据到本地内存
  6. 磨刀不误砍柴工,ORAchk健康检查好帮手
  7. C和C++ const的声明差异
  8. Ojbect-C     NSArray和NSMutableArray数组的使用   有关API查询
  9. 使用JavaMail技术发送邮件
  10. MySQL: ERROR13(HY000):Can't get stat of的问题