CF1580E Railway Construction

CF1580E Railway Construction

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

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

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

(1le n,m,q le 3cdot 10^5,1le a_ile 10^9, 1le xle 4cdot 10^8)

Solution

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

可以发现,将所有点按照 ( ext{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(mlog m+(n+q)log n))

原文地址:https://www.cnblogs.com/wlzhouzhuan/p/15359277.html