P2680 运输计划(树上差分+lca+二分)
題目背景
公元 20442044 年,人類進入了宇宙紀元。
題目描述
公元20442044 年,人類進入了宇宙紀元。
L 國有 nn 個星球,還有 n-1n?1 條雙向航道,每條航道建立在兩個星球之間,這 n-1n?1 條航道連通了 LL 國的所有星球。
小 P 掌管一家物流公司, 該公司有很多個運輸計劃,每個運輸計劃形如:有一艘物流飛船需要u_iu i號星球沿最快的宇航路徑飛行到 v_iv i號星球去。顯然,飛船駛過一條航道是需要時間的,對于航道 jj,任意飛船駛過它所花費的時間為 t_jt j,并且任意兩艘飛船之間不會產生任何干擾。
為了鼓勵科技創新, LL 國國王同意小 PP 的物流公司參與 LL 國的航道建設,即允許小PP 把某一條航道改造成蟲洞,飛船駛過蟲洞不消耗時間。
在蟲洞的建設完成前小 P 的物流公司就預接了 mm 個運輸計劃。在蟲洞建設完成后,這 mm 個運輸計劃會同時開始,所有飛船一起出發。當這 mm 個運輸計劃都完成時,小 PP 的物流公司的階段性工作就完成了。
如果小 PP 可以自由選擇將哪一條航道改造成蟲洞, 試求出小 PP 的物流公司完成階段性工作所需要的最短時間是多少?
輸入格式
第一行包括兩個正整數 n, mn,m,表示 L 國中星球的數量及小 P 公司預接的運輸計劃的數量,星球從 11 到 nn 編號。
接下來 n-1n?1 行描述航道的建設情況,其中第 ii 行包含三個整數 a_i, b_ia
i
? ,b
i
? 和 t_it
i
? ,表示第 ii 條雙向航道修建在 a_ia
i
? 與 b_ib
i
? 兩個星球之間,任意飛船駛過它所花費的時間為 t_it
i
? 。數據保證 1 \leq a_i,b_i \leq n1≤a
i
? ,b
i
? ≤n 且 0 \leq t_i \leq 10000≤t
i
? ≤1000。
接下來 mm 行描述運輸計劃的情況,其中第 jj 行包含兩個正整數 u_ju
j
? 和 v_jv
j
? ,表示第 jj 個運輸計劃是從 u_ju
j
? 號星球飛往 v_jv
j
? 號星球。數據保證 1 \leq u_i,v_i \leq n1≤u
i
? ,v
i
? ≤n
輸出格式
一個整數,表示小 PP 的物流公司完成階段性工作所需要的最短時間。
輸入輸出樣例
輸入 #1 復制
6 3
1 2 3
1 6 4
3 1 7
4 3 6
3 5 5
3 6
2 5
4 5
輸出 #1 復制
11
說明/提示
所有測試數據的范圍和特點如下表所示
求所有邊最大值的最小化。這種題一看就是二分。
關于邊的差分(如找被所有路徑共同覆蓋的邊
首先我們除了一般的grand,depth等數組以外,多開兩個數組:tmp和prev。
tmp用來記錄點的出現次數(具體點說實際上記錄的是點到其父親的邊的出現次數),prev記錄每個點到其父親的那條邊。對于一條起點s,終點t的路徑。我們這樣處理:
tmp[s]++,tmp[t]++,tmp[LCA(s,t)]-=2。(記住:最后要從所有葉結點把權值向上累加。)以一次操作為例,我們來看看效果(可以畫一張圖)。首先tmp[s]++,一直推上去到根,這時候s到root的路徑訪問次數都+1,tmp[t]++后,t到lca路徑加了1,s到lca路徑加了1,而lca到根的路徑加了2。
這時,我們只需要tmp[LCA(s,t)]-=2,推到根,就能把那些多余的路徑減掉,達到想要的目的。而這是一次操作,對于很多次操作的話,我們只需要維護tmp,而不必每次更新到根,維護好tmp最后Dfs一遍即可。這時如果tmp[i]==次數的話,說明i到其父親的邊是被所有路徑覆蓋的。如圖
代碼如下:
努力加油a啊,(o)/~
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的P2680 运输计划(树上差分+lca+二分)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: P3258 [JLOI2014]松鼠的新
- 下一篇: Diversity HDU - 6725