CF1580E Railway Construction

铁路系统中有 \(n\) 个车站和 \(m\) 条双向边,有边权,无重边。这些双向边使得任意两个车站互相可达。

你现在要加一些单向边 \((u,v,w)\) ,\(w\) 随便定,代价是 \(a_u\) ,使得从 \(1\) 号车站出发到每个车站都有至少两条边不相交的路线,并且最短路不改变。

由于不可控因素,\(a\) 序列会受到 \(q\) 次修改,每次让 \(a_u \leftarrow a_u+x\) ,并求当前的最小代价。

\(1\le n,m,q \le 3\cdot 10^5,1\le a_i\le 10^9, 1\le x\le 4\cdot 10^8\) 。

Solution

首先从 \(1\) 出发跑最短路,显然非最短路边是无用的。因此建出最短路图,我们在 DAG 上讨论问题。

可以发现,将所有点按照 \(\text{dis}\) 排序是合法的拓扑序,而只要有一个点入度 \(\ge 2\) ,那么它已经满足要求了。

所以,问题转化为将所有入度 \(=1\) 的点新连一条边,那么肯定挑拓扑序在它之前的 \(a\) 最小的点。

因此在拓扑序上维护前缀 \(a\) 最小值和次小值的点即可,暴力复杂度 \(\mathcal O(nq)\) 。

考虑优化,我们将所有改变前缀最小/次小的位置丢进一个 set 里,显然二元组 (最小值,次小值) 构成一个个区间。倒着处理询问(即每次 \(a_u\) 变小):

  • \(u\) 是这个区间的最小值

    可以发现它对区间不会造成任何影响,只对答案产生了影响;求对答案影响的部分,可以用一棵线段树去维护;

  • \(u\) 是这个区间的次小值

    注意到不同区间的次小值一定不一样(这个显然),因此只有撑死 \(1\) 个区间符合该条件,暴力修改即可;

  • \(u\) 既不是这个区间的最小值,也不是次小值

    类比颜色段均摊的思想,它修改的区间端点会从 set 里 erase 掉,同时把它加进 set 里,而 set 里的端点个数总计是 \(\mathcal O(n+q)\) 的,因此直接暴力做即可。

总时间复杂度 \(\mathcal O(m\log m+(n+q)\log n)\) 。

最新文章

  1. jquery2源码分析系列
  2. C++学习笔记(3)
  3. android JSON获取值String无法转换成JSONObject
  4. 如何删除xcode项目中不再使用的图片资源
  5. 初识IOS
  6. __init__ 和 self
  7. Python操作列表的常用方法
  8. Rhythmbox乱码的解决的方法
  9. Unity 制作RPG小地图
  10. Central Europe Regional Contest 2012 Problem H: Darts
  11. 编辑器之神-vim的使用
  12. Springboot集成FreeMarker
  13. python基础6--面向对象基础、装饰器
  14. mount.cifs permission denied
  15. redis底层设计(三)——redis数据类型
  16. 【Social Listening实战】当数据分析遭遇心理动力学:用户深层次的情感需求浮出水面
  17. Military Problem CodeForces - 1006E(dfs搜一下 标记一下)
  18. 执行计划--在存储过程中使用SET对执行计划的影响
  19. 开发Google Material Design风格的WPF程序
  20. Flask与pyaudio实现音频数据流的传输(电话会议语音交互式应用)

热门文章

  1. 人机交互BS
  2. 前端加密办法之混淆js加密
  3. DRF 过滤排序分页异常处理
  4.  CPUs Intel 925X/915 Chipset (925X主板芯片组)
  5. ORM中聚合函数、分组查询、Django开启事务、ORM中常用字段及参数、数据库查询优化
  6. 前端之HTML标签
  7. Bootstrap Blazor Table 组件(二)
  8. Axios及其async await封装
  9. TexFormula2Word: 将Latex公式转换为MathML的Chrome扩展
  10. 2021.12.02 P4001 [ICPC-Beijing 2006]狼抓兔子(最小割)