CF1666K Kingdom Partition
我們首先欽定 \(A\) 點選了 A,\(B\) 點選了 B,其它點選了 C,這樣會有一個代價。
然後我們嘗試將每個 C 點改成 A 或者改成 B。我們將其看成一個物品,其代價為其所有向外的連邊之和。
而同時,對於每條邊,如果其兩端是不同的顏色,其會使代價減少 \(2l\)。我們將這條邊看成兩個物品,含義是,如果選了這個物品,那麼其中一個端點要選 A,另一個要選 B。
然後我們跑最大/小權閉合子圖就好了……嗎?
並不是,我們並不能保證一個點的 “改 A”、“改B” 兩種物品不被同時選擇。
但是,如果你仔細計算一下貢獻,會發現一個點同時改成兩種所帶來的貢獻為 \(0\),也就相當於啥都不變保持為 C,因此是沒有問題的。時間複雜度是網路流複雜度。
submission
CF983D Arkady and Rectangles
考慮掃描線,線段樹上每個節點標記永久化一下這個節點代表的區間被哪些顏色覆蓋了,然後線段樹上每個節點維護一下區間內顏色最小的點,以及最大的沒有顯露出的點,然後每次暴力將一個之前沒有被看見的節點標記即可,複雜度 \(O(n\log ^2n)\)。
注意離散化有一點細節。
submission
QOJ #3091. Japanese Knowledge
這題非常高妙在第一步,我們考慮構造一個雙射。
對於一個 \(k\),我們說明,恰有 \(k\) 個位置滿足 \(x_i=A_i\) 與前 \(k\) 個位置 \(x_i=0\),後面的位置 \(x_i<A_i\) 構成雙射。
左邊對右邊的對映只需要將 \(x_i=A_i\) 的位置看成 \(0\),然後將 \(0\) 全部移到開頭即可,因為 \(A\) 是單調不降的所以如果原來 \(A_i<x_i\),那往後移動肯定還是 \(A_i< x_i\)。
右邊對左邊的對映可以考慮將每個 \(x_i\) 儘量往前移動直到不能移為止,這也是一一對應的。
因此我們的問題變成,給一個階梯狀的網格,要求從右邊界任意點出發,走到下邊界每個點的方案數。
考慮分治 NTT,所做的就是在一個階梯狀網格上,已知走到右邊界每個點的方案數,求出走到下邊界每個點的方案數。
分治,取分值區間 \([l,r]\) 中點 \(m\),將 \([m+1,r]\) 的 \(A_i\) 都減去 \(A_m\),然後分治做上面那個階梯,接著我們有一個矩形,知道走到上邊界和右邊界的方案數,要求走到左邊界和下邊界每個點的方案數,這個可以四次卷積實現,最後遞迴左邊的階梯狀物即可。
時間複雜度 \(O((n+A_n)\log ^2n)\)。submission
Topcoder 12985 LotteryTree
考慮一個比較暴力的做法:記 \(f(x,T)\) 表示 \(x\) 子樹 dfs 序之前的機率之和是 \(T\),是否存在一種 dfs 序使 \(x\) 滿足條件,求解這個只需要計算每個兒子能不能放在某個位置上,然後做一個匹配即可。葉子處需要特殊判斷。我們最終要求 \(f(0,0)\)。
但是這樣複雜度顯然爆炸。有一個剪枝:如果 \(T\) 往後這個子樹內都沒有 \(\frac{1}{p}\) 這個點了,那麼顯然是滿足條件的,加上這個剪枝發現過了。
這個狀態數可以這樣理解:走到一個點的時候一定對應了某個區間內的關鍵點,而這個區間的關鍵點是和之前祖先放在第幾個兒子唯一對應的。又因為現在子樹內的區間機率是確定的,所以本質不同的關鍵點區間只有 \(O(p)\) 個,總狀態數就是 \(O(np)\)。
使用匈牙利做匹配,複雜度 \(O(n^4p)\),因為不滿可以透過。
submission
Topcoder 13503 ConnectingGame
考慮如果同時不存在兩條路徑從上到下以及從左到右,那麼肯定同時存在兩條八聯通的路徑從上到下從左到右。
這兩條路徑肯定會在一個 \(2\times 2\) 的小方格中相交,其中一條從左上走到右下,另一條從右上走到左下,則我們建立這樣的圖,然後跑網路流即可。
等等,你這樣流四條路徑起終點對應關係不會錯嗎?
實際上是不會的,因為假設兩條路徑交換了起終點,則肯定在一個 \(2\times 2\) 的小方格經歷瞭如上交換,這時可以交換兩邊的終點,這樣就對了。
submission
鞅的停時定理在 OI 中的應用
鞅的停時定理在 OI 中 P 用沒有。
大概就是要構造一個勢能函式 \(\varphi(X)\),滿足 \(\varphi(X)=\sum\varphi(X')p(X')-1\),其中 \(X'\) 表示 \(X\) 的後繼狀態,以及對應的機率。並且這個勢能函式要滿足終止點是最高點,這樣用終止點的勢能減去起點的勢能即可。
CF1025G Company Acquisitions
考慮定義單個點的勢能函式為 \(f(x)\),表示一個後面跟著 \(x\) 個未選中點的選中點的勢能。
如果我們單次對兩個被分別有 \(x,y\) 個兒子的標記點操作,就會 \(\frac{1}{2}\) 機率變成 \(x+1,0\),\(\frac{1}{2}\) 機率變成 \(y+1,0\),按照這個列式有 \(f(x)+f(y)=\frac{1}{2}f(x+1)+\frac{1}{2}f(y+1)+f(0)-1\)。
因為勢能是相對的,所以我們直接大力認為 \(f(0)=0\),那麼有 \(f(x)+f(y)=\frac{1}{2}(f(x+1)+f(y+1))-1\)。
直接讓 \(x\) 和 \(y\) 獨立開來,有 \(f(x)=\frac{1}{2}f(x+1)-1\) ,解得 \(f(x)=2^x-1\),可以直接計算。
submission
CF1349D Slime and Biscuits
記 \(f(x)\) 表示一個有 \(x\) 個餅乾的人的勢能。
考慮一個人的餅乾數 \(+1,-1\) 以及不變的機率,記 \(m=\sum a_i\),式子是
將 \(-1\) 平均分拆進去,即可遞推,時間複雜度 \(O(n+\sum a_i)\)。
submission
CF850F Rainbow Balls
記 \(f(x)\) 表示一個有 \(x\) 個球的顏色的勢能。
按照上題考慮,記 \(m=\sum a_i\),式子是
然後你發現這時候 \(-1\) 不能每個 \(\frac{1}{n}\) 拆進去了!因為如果你直接拆進去 \(a_i=0\) 處的式子就不對了!
為了使 \(a_i=0\) 處的常數項歸 \(0\),我們拆 \(\frac{a_i}{m}\) 進去就可以滿足條件。
另一個問題是,\(m\) 實在有點大了,\(f(m)\) 處的值不好求。
不過好在這個遞推式可以寫成足夠簡單的形式,具體來說就是 \(f_i=2f_{i-1}-f_{i-2}+\frac{m-1}{m-(i-1)}\)。
計算每個 \(\frac{m-1}{m-(i-1)}\) 對 \(f(m)\) 的貢獻,容易發現都是 \(m-1\),於是 \(f_m\) 就是 \(m(m-1)\),然後剩下暴力遞推即可。
時間複雜度 \(O(\max a_i\log m+n)\)。submission