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)\) 。