代碼能力還是太差
C.Museums Tour
明示拆點,縮點後拓撲排序。
發現若存在 ,則必然可達,大小爲,所以所有的指向的後繼中必然不存在。所以保證了每個點的貢獻只會被算次。
考慮同一個SCC中的所有點,若存在一個簡單環使得最小,設最小值爲,則若中存在,那麼所有都在這個中。
任意選中的一個點做根求生成樹,即得到所有簡單環的,預處理出時刻從出發能訪問的點數。
兩個之間的連邊,保證邊數是的。
注意在實現過程中不需要真的拆點。
細節比較多,具體還是看yyb’s blog吧
D.Cooperative Game
好妙!
考慮如何用兩個點的移動找到:
讓兩個點同時移動,點每次移動,點每兩次移動一格,直到兩點相遇。
具體分析這個過程:設當移動格時,在格,那麼,再走輪追上,
位置均爲。然後所有點一起向前移:其它點輪後到達位置,點輪後到達。
次數
E.Train Car Selection
如果在前端插入,後面的點一定不會是最優點。
所以只有在幾輪沒有前段插入的修改後最優值可能爲後面的一些點,每個點的編號看做座標,常數項看做座標,則只需要維護一個下左凸殼,每次暴力彈棧頂(注意第一個點是)。
可以結合下圖理解
F. Matches Are Not a Child’s Play
操作2,3是等價的。
對於一次的修改,設修改前優先級最大的點爲,發現燃燒次序的改變很有規律:
路徑上的點倒序構成序列的後半部分,其餘點的相對次序不變構成前半部分。
於是把一次修改操作相當於把鏈染上新的一種顏色。
詢問點的次序相當於詢問顏色編號比它小的所有的鏈的總點數+同色點優先級比它小的點數。
把當前優先級最大的點作爲根,修改操作就可以用的維護了。
BIT維護每個顏色編號的點數,詢問相當於求顏色編號前綴和-當前點splay到根後左兒子大小。