NOIP2024集訓 Day51 略解

Saltyfish6發表於2024-10-14

前言

你只記得,努力之後,是九死一生。卻忘了,若不努力,便是十死無生。

感覺今天的題充其量也是一堆典題,可是我還是菜的不會幾道,做過的都不會了。。

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

相關文章