


【题解】CF1163F Indecisive Taxi Fee
热度: loading...
每周文章计划 2021.12 第三周
管理求过
定义:
: 的最短路
: 的最短路
:边的两个端点以及边权
: 在最短路上的前驱点
: 在最短路上的前驱边
:经过 点的最短路与原最短路重合的前缀长度,经过 点的最短路与原最短路重合的后缀长度。
题目大意
给你一个 个点, 条边的无向图,每条边连接点 、,并且有个长度 。
有次询问,每次询问给你一对 、, 表示仅当前询问下,将 这条边的长度修改为 ,请你输出当前 到 的最短路长度。
数据范围
首先由于这是最短路问题,我们先求出 的最短路。
然后考虑修改,我们将修改分为四种:
1. 修改在最短路上,边权变小
这种是最好解决的,最短路上的边权变小肯定还是最短路,所以直接输出新的最短路 即可。
2. 修改不在最短路上,边权变大
这种也好解决,不在最短路上的边的边权变大,最短路肯定还是原来的最短路,输出 即可。
3.修改不在最短路上,边权变小
这个需要稍微想一下,我们可以从 再做一遍最短路,然后我们可以用 和 来更新答案,这两个中一定有一个是经过 边的新最短路
4.修改在最短路上,边权变大
这个就是最难想的情况了,这样修改原来的最短路有可能不是最短路,但如果用最短路之外的边修改又不知道用哪条边修改。
当然是丢回去重新跑一遍最短路啊
为了解决这个问题,我们先给出一个结论:
从 ,经过一条边的最短路径,肯定有一段前缀以及一段后缀和最短路重合
换而言之,就是与最短路不重合的部分最多只有一段,且是连续的。
证明: 如果有多于一段与原最短路不重合,那么这些段中必然只有一段包含 ,其他段改成原最短路上的路径就会使总路程更小,则假设不成立
那么得知了这个结论后,我们可以知道经过 点的最短路,就是不经过第 的最短路,换算到边 上,就是不经过边 和 的边
看到区间操作,第一反应必然是用线段树 不会是平衡树吧 ,因此我们可以写一颗非常短的维护最小值的线段树,然后维护不经过最短路上每条边时的最短路,在讯问时查询不经过边 的最短路是否比 短即可。
具体实现
首先是记下最短路,我们从 跳 ,一直跳到 ,记录下 即可。
对于最短路上的每个点, 为最短路上链接到自己的边, 为最短路上自己延伸出去的边。
然后做两遍 Dij ,一遍从 ,一遍从 , 和 分别从第一遍和第二遍的前驱继承即可。
CF时限卡得紧,记得加快读。
至此本道题完全做完。
