题目描述:
好久没出去旅游啦!

森森决定去 Z 省旅游一下。

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

Z 省为了鼓励大家在省内多逛逛,推出了旅游金计划:在 i 号城市可以用 1 元现金兑换 ai 元旅游金(只要现金足够,可以无限次兑换)。

城市间的交通即可以使用现金支付路费,也可以用旅游金支付。

具体来说,当通过第 j 条旅行线路时,可以用 cj 元现金或 dj 元旅游金支付路费。

注意:每次只能选择一种支付方式,不可同时使用现金和旅游金混合支付。

但对于不同的线路,旅客可以自由选择不同的支付方式。

森森决定从 1 号城市出发,到 n 号城市去。

他打算在出发前准备一些现金,并在途中的某个城市将剩余现金 全部 换成旅游金后继续旅游,直到到达 n 号城市为止。

当然,他也可以选择在 1 号城市就兑换旅游金,或全部使用现金完成旅程。

Z 省政府会根据每个城市参与活动的情况调整汇率(即调整在某个城市 1 元现金能换多少旅游金)。

现在你需要帮助森森计算一下,在每次调整之后最少需要携带多少现金才能完成他的旅程。

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

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

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

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

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

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

数据范围
1≤n≤105,
1≤m≤2×105,
1≤q≤105,
1≤u,v≤n,
1≤c,d≤109,
1≤ai≤109,
1≤xi≤n,
1≤a′i≤109
输入样例:

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 号城市兑换旅游金。
思路:
选取一个中间点k,表示在点进行交易。k点前用现金,k点后用旅游金。
相当于建两个图,一个图的边权用现金表示,另一个图的边权用旅游金表示。
在建图结束之后,用multiset来维护用1到n所需要的现金。
由于需要修改汇率,那么需要在每次修改汇率之后更新multiset。
multiset用法:

  • 定义方式 : multiset<long long> S;
  • 加入元素方式:S.insert(x)
  • 删除方式: S.erase(S.find(x))
  • 查找方式:S.find(x)
  • 使用最小值:*S.begin()

代码:

#include<iostream>
#include<queue>
#include<cstring>
#include<cmath>
#include <set>
using namespace std;
typedef pair<long long,int>PII;
const int N=1e6+10;
const long long INF=0x3f3f3f3f3f3f3f3fll;
int e[N],ne[N],w[N],h[N],hs[N],idx=0;
int rate[N];
bool st[N];
long long dist1[N],dist2[N];
int r[N];
void add(int a,int b,int c,int h[])
{e[idx]=b;w[idx]=c;ne[idx]=h[a];h[a]=idx;idx++;
}
void dijkstra(int u,int h[],long long dist[])
{memset(st,false,sizeof st);priority_queue<PII,vector<PII>,greater<PII>>q;dist[u]=0;q.push({0,u});while(!q.empty()){PII t=q.top();q.pop();int pos=t.second;long long dis=t.first;if(st[pos]){continue;}st[pos]=true;for(int i=h[pos];i!=-1;i=ne[i]){int j=e[i];if(dist[j]>dis+w[i]){dist[j]=dis+w[i];q.push({dist[j],j});}}}
}
int main()
{int n,m,q;cin>>n>>m>>q;memset(h,-1,sizeof h);memset(hs,-1,sizeof hs);for(int i=0;i<m;i++){int a,b,c,d;scanf("%d%d%d%d",&a,&b,&c,&d);add(a,b,c,h);add(b,a,d,hs);}memset(dist1,0x3f,sizeof dist1);memset(dist2,0x3f,sizeof dist2);dijkstra(1,h,dist1);dijkstra(n,hs,dist2);for(int i=1;i<=n;i++){scanf("%d",&rate[i]);}multiset<long long> S;for (int i = 1; i <= n; i++)if (dist1[i] != INF && dist2[i] != INF) {S.insert(dist1[i] + (dist2[i] + rate[i] - 1) / rate[i]);}while (q--) {int x, a;scanf("%d%d", &x, &a);if (dist1[x] != INF && dist2[x] != INF) {S.erase(S.find(dist1[x] + (dist2[x] + rate[x] - 1) / rate[x]));rate[x] = a;S.insert(dist1[x] + (dist2[x] + rate[x] - 1) / rate[x]);}printf("%lld\n", *S.begin());}return 0;
}

AcWing 3468. 森森旅游相关推荐

  1. 重返天梯-L3-028 森森旅游 (30 分) (堆优化dijkstra+multiset)

    题目描述 重返天梯-L3-028 森森旅游 (30 分)原题链接 森森决定从 1 号城市出发,到 n 号城市去.他打算在出发前准备一些现金,并在途中的某个城市将剩余现金 全部 换成旅游金后继续旅游,直 ...

  2. L3-1 森森旅游 (30 分)

    L3-1 森森旅游 (30 分) 好久没出去旅游啦!森森决定去 Z 省旅游一下. Z 省有 n 座城市(从 1 到 n 编号)以及 m 条连接两座城市的有向旅行线路(例如自驾.长途汽车.火车.飞机.轮 ...

  3. L3-028 森森旅游 (30 分)-PAT 团体程序设计天梯赛 GPLT

    好久没出去旅游啦!森森决定去 Z 省旅游一下. Z 省有 n 座城市(从 1 到 n 编号)以及 m 条连接两座城市的有向旅行线路(例如自驾.长途汽车.火车.飞机.轮船等),每次经过一条旅行线路时都需 ...

  4. 7-4 森森旅游 (20 分)

    好久没出去旅游啦!森森决定去 Z 省旅游一下. Z 省有 n 座城市(从 1 到 n 编号)以及 m 条连接两座城市的有向旅行线路(例如自驾.长途汽车.火车.飞机.轮船等),每次经过一条旅行线路时都需 ...

  5. dijkstra题目实战

    目录 常用模板 一:朴素dijkstra算法模板 模板题 AcWing 849. Dijkstra求最短路 I 二:堆优化版dijkstra -- 模板题 模板题 AcWing 850. Dijkst ...

  6. 第七届团队程序设计天梯赛 题目解析讲解

    B站正在录视频- 题目是2022年5月天梯赛决赛原题: 题号 题目名称 L1-1 今天我要赢 L1-2 种钻石 L1-3 谁能进图书馆 L1-4 拯救外星人 L1-5 试试手气 L1-6 斯德哥尔摩火 ...

  7. 第六届团队程序设计天梯赛 全题目解析讲解

    B站已经录好视频合集:--------------------传送门--------------------- 题目是2021年4月天梯赛决赛原题: 题号 题目名称 L1-1 人与神 L1-2 两小时 ...

  8. 2021-天梯赛(cccc)比赛题解

    写在前面 今年的天梯赛因为四月事多,没有参加,后面抽空把题做了一下,难度不大,但是有不少细节需要注意.写一篇博客来稍微总结一下这套比赛的一些坑点吧.第一部分题目没什么好说的,贴一份代码放着. L-1- ...

  9. 2021团体程序设计天梯赛题解

    先贴成绩 今年L1的题偏基础,比赛用了一个小时切完了,(算上PTA系统网络错误崩了20分钟和BW傻等-QAQ)L2顺着做的,L2-1模拟过了去看L2-2,并查集写完数据跑错了,调了一个小时发现题目说明 ...

最新文章

  1. 公开课报名 | 基于自定义模板的OCR结果的结构化处理技术
  2. CentOS自动挂载光驱和U盘
  3. FlashInspector 【Firefox浏览器插件,flash分析工具】
  4. Wcf 双工通信的应用
  5. java实用教程——组件及事件处理——设置组件的位置(相对于窗口具体位置和布局)
  6. 基于HTTP构建YUM网络源实战
  7. centos7 mysql升级漏洞5.7.30
  8. 基于JavaSpringMvc+mybatis实现学生信息管理系统
  9. 数据挖掘-基于随机森林模型的企业偷漏税纳税人识别
  10. php工具apache启动失败,phpstudy中apache启动失败的原因是什么?
  11. 【PYG】常用和采坑总结
  12. Freemarker 简介 及手册
  13. 衣服裤子染色了怎么办
  14. word标题前自动分页
  15. python时间相减_python处理时间加减
  16. 机器学习 --- 4. 大内密探HMM(隐马尔可夫)围捕赌场老千
  17. java 动态链接_菜鸟提问:java 调用不了Windows动态链接库方式出错
  18. 如何使用阿里百川hotfix热修复功能(三)
  19. 【小5聊】TortoiseGit代码管理之hint: Updates were rejected because a pushed branch tip is behind its remote
  20. 从技术角度看“星闪“技术

热门文章

  1. 推荐6款在线软件行为分析系统(沙盒)
  2. [2022世界杯] 小白也可以看懂的世界杯
  3. matplotlib:为饼图或圆环图添加引导线
  4. 写电子合同,爬过的坑,趟过的雷,犯过的错,都是泪
  5. 计算机桌面右下没有网络连接,笔记本电脑,WIN10系统,右下角没有网络连接..._网络编辑_帮考网...
  6. APP上线前,如何做运营推广工作?
  7. 萌新学习C++容易漏掉的知识点,看看你中招了没有(一)
  8. UI非常漂亮的数诚1对1直播/带收徒/带公会/运营版本
  9. python 基于pillow模块生成随机图片验证码教程
  10. postInvalidate和invalidate的区别