前言
你只記得,努力之後,是九死一生。卻忘了,若不努力,便是十死無生。
感覺今天的題充其量也是一堆典題,可是我還是菜的不會幾道,做過的都不會了。。
Cheap Robot
顯然,你可以先從每個充電站出發跑一個多源最短路,得到每個點 \(x\) 到其最近的充電站的距離 \(dis_x\)。
有一個更加顯然的東西是,你無論當前走到了哪個點,假設是 \(x\),當前剩餘容量為 \(y\),你一定要滿足 \(dis_x\le y\)。
同理,如果你要到達一個點,那麼油箱容量也必須 \(\ge dis_x\)。
那麼,你發現,對於任意一條邊 \((u,v,w)\),經過他所需的最小容量就是 \(dis_u+dis_v+w\),你要求的就是對於 \(a\to b\) 的每條路徑上經過每條邊的最小容量最大值的最小值。
顯然直接上 \(\texttt{Kruskal}\) 重構樹就直接秒了。
有序奶牛
題目保證按照輸入的偏序建邊一定是個 \(\texttt{Dag}\),而我最開始根本就沒有發現這件事情。
一個比較直觀的刪邊方法就是你再刪掉這條邊之後,剩下的邊仍然可以使得這條邊的起點到達終點。
具體實現就是你先跑一邊拓撲序,然後對於每一條邊 \(u,v\) 按照 \(\text{topo}_u\) 為第一關鍵字,\(\text{topo}_v\) 為第二關鍵字從小到大排序。
然後你按照排序後的順序遍歷每條邊,更新連通性即可,可以透過 \(\texttt{Bitset}\) 做到 \(\mathcal{O}(\frac{nm}{w})\)。
變換序列
按照題目中給得 \(D(i,j)\) 的定義和具體的值,每個點最多連出去四條邊,然後直接跑最小字典序完美匹配即可。
字典序的話你直接對於邊權最小到大遍歷即可。
Dynamic Shortest Path / 動態最短路
挺不錯的一道題。
暴力思路是你對於每次操作之後跑一遍 \(\texttt{Dijkstra}\),複雜度 \(\mathcal{O}(q\times m\log n)\),直接炸掉。
我們發現這個 \(\log n\) 非常難受,想一下有沒有辦法把他搞掉。
有一個比較重要的東西是,如果 \(\forall x\in[1,n],dis_x\le V\),那麼你可以把堆最佳化 \(\texttt{Dijkstra}\) 改成用桶排最佳化,複雜度可以做到 \(\mathcal{O}(V+n+m)\)。