L3-1 森森旅游 (30 分)

好久没出去旅游啦!森森决定去 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≤ai′​≤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

结尾无空行

#include<bits/stdc++.h>using namespace std;typedef long long LL;
typedef pair<LL,int>PLL;const int N=100010,M=200010*2;
const LL INF=0x3f3f3f3f3f3f3fll;int n,m,Q;
int h1[N],h2[N],e[M],w[M],ne[M],idx;
LL dist1[N],dist2[N];
bool st[N];int ratio[N];//汇率//带边权的加边函数
void add(int h[],int a,int b,int c)//添加一条边a->b,边权为c
{e[idx]=b;w[idx]=c;ne[idx]=h[a];h[a]=idx++;
}void dijkstar(int h[],LL dist[],int start)
{memset(dist,0x3f,sizeof(dist1));memset(st,0,sizeof(st));dist[start]=0;priority_queue<PLL,vector<PLL>,greater<PLL>>heap;heap.push({0,start});while(heap.size()){auto t=heap.top();heap.pop();int ver=t.second;if(st[ver])continue;for(int i=h[ver];i!=-1;i=ne[i]){int j=e[i];if(dist[j]>dist[ver]+w[i]){dist[j]=dist[ver]+w[i];heap.push({dist[j],j});}}}
}
int main(){scanf("%d%d%d",&n,&m,&Q);memset(h1,-1,sizeof(h1));//清空邻接表表头memset(h1,-1,sizeof(h1));while(m--){//读入m条边int a,b,c,d;scanf("%d%d%d%d",&a,&b,&c,&d);add(h1,a,b,c);//从起点除发只用现金的距离最小值add(h2,b,a,d);//(反向边)中点出发}//读入汇率for(int i=1;i<=n;i++)scanf("%d",&ratio[i]);dijkstar(h1,dist1,1);dijkstar(h2,dist2,n);multiset<LL>S;for(int i=1;i<=n;i++)if(dist1[i]!=INF&&dist2[i]!=INF){S.insert(dist1[i]+(dist2[i]+ratio[i]-1)/ratio[i]);}while(Q--){int a,b;scanf("%d%d",&a,&b);if(dist1[a]!=INF&&dist2[a]!=INF){S.erase(S.find(dist1[a]+(dist2[a]+ratio[a]-1)/ratio[a]));ratio[a]=b;S.insert(dist1[a]+(dist2[a]+ratio[a]-1)/ratio[a]);}printf("%lld\n",*S.begin());}return 0;
}

样例解释:

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

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

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

L3-1 森森旅游 (30 分)相关推荐

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

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

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

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

  3. 【CCCC】L3-017 森森快递 (30分),线段树rmq模板+贪心排序

    problem L3-017 森森快递 (30分) 森森开了一家快递公司,叫森森快递.因为公司刚刚开张,所以业务路线很简单,可以认为是一条直线上的N个城市,这些城市从左到右依次从0到(N−1)编号.由 ...

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

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

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

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

  6. 【CCCC】L3-018 森森美图 (30分),计算几何+判断三点共线+bfs最短路

    problem L3-018 森森美图 (30分) 森森最近想让自己的朋友圈熠熠生辉,所以他决定自己写个美化照片的软件,并起名为森森美图.众所周知,在合照中美化自己的面部而不美化合照者的面部是让自己占 ...

  7. 【CCCC】L3-022 地铁一日游 (30分),floyd+大模拟

    problem L3-022 地铁一日游 (30分) 森森喜欢坐地铁.这个假期,他终于来到了传说中的地铁之城--魔都,打算好好过一把坐地铁的瘾! 魔都地铁的计价规则是:起步价 2 元,出发站与到达站的 ...

  8. 【CCCC】L3-013 非常弹的球 (30分)物理计算

    problem L3-013 非常弹的球 (30分) 刚上高一的森森为了学好物理,买了一个"非常弹"的球.虽然说是非常弹的球,其实也就是一般的弹力球而已.森森玩了一会儿弹力球后突然 ...

  9. 7-13 非常弹的球 (30 分)

    7-13 非常弹的球 (30 分) 刚上高一的森森为了学好物理,买了一个"非常弹"的球.虽然说是非常弹的球,其实也就是一般的弹力球而已.森森玩了一会儿弹力球后突然想到,假如他在地上 ...

最新文章

  1. Visual Studio 2005 Team System: Demo Videos
  2. python turtle画熊-基于turtle的Python作画
  3. Git冲突:commit your changes or stash them before you can merge.
  4. c++primer 3.4练习题
  5. 英特尔云计算策略以Nehalem为主
  6. windows下,linux下elasticsearch安装插件head插件的步骤
  7. [20170516]nvl与非NULL约束.txt
  8. 用数据告诉你出租车资源配置是否合理
  9. TheFatRat生成免杀木马(powershell)报错问题
  10. 两台计算机互联方案,两台电脑共享(无线上网)最佳解决方案_网络协议
  11. 高等数学笔记:三重积分下的坐标系变换
  12. html文本如何逐渐淡入,CSS如何实现文字淡入效果
  13. 吾生也有涯,而学也无涯
  14. 华为谷歌android 6.0是什么,盘点那些用上Android 6.0的手机
  15. MATLAB数学建模必备算法--层次分析法AHP
  16. 提高员工执行力,提高项目执行力,提升企业执行力
  17. 对python的理解_《对》字意思读音、组词解释及笔画数 - 新华字典 - 911查询
  18. 华为交换机配置远程登录
  19. 代码review原则
  20. 虚拟机文件管理的基本命令

热门文章

  1. 渗透测试入门17之一次完整的渗透测试流程
  2. socket编程实例_NIO之网络编程源码阅读
  3. python学习笔记之random模块
  4. open() 函数以 w+ 模式打开文件
  5. Objective-C的基础数据结构
  6. 符合我公司GIS开源解决方案的探讨
  7. Springboot2.x使用redis作为缓存
  8. 异步简析之BlockingCollection实现生产消费模式
  9. float,absolute脱离文档流的总结
  10. 1064金明的预算方案