[NOIP2022] 建造軍營

Yorg發表於2024-11-21

前言

米奇妙妙 \(\rm{dp}\) , 也是高階計數

這種題看得懂想不出, 還是非常難蚌

能不能多想想再去看 \(\rm{TJ}\)

演算法

注意到除了割邊, 其他的邊都沒有影響, 顯然可以縮 \(\rm{e}\)-\(\rm{DCC}\) 再進行處理

這裡發現縮完之後形成一棵樹, 考慮樹形 \(\rm{dp}\)

這裡我有一個誤區, 就是答案必須要是幾個 \(f_x\) 組合到一起, 但是實際上完全不用
對於樹這種特殊結構, \(f_{root}\) 已經包含了所有情況

因此令 \(f_{x, 0/1}\) 表示只在 \(x\) 的子樹之內建造軍營, 軍營的
首先考慮答案式子, 我們注意到, 答案應該是多種情況累加, 因為 \(f_{x, 1}\) 實際上是不重不漏的, 主要需要處理的是那些無關緊要的邊, 我們選擇守或者不守
注意到如果縮完點之後當前子樹的大小為 \(Size_x\) , 我們就有 \(Size_x - 1\) 條割邊要守, 其中子樹外的 \(m - Size_x + 1\) 條邊可以任選
這裡有一個超級巨大的問題: 對於當前節點到父節點的邊, 一定不能選, 因為對於父節點, \(f_{fa, 1}\) 實際上考慮了這條邊, 選上之後會導致重複, 因此記錄答案時不能算這條邊

事實上如果最早就有關於答案式的思路, 可以透過手推樣例/觀察性質發現這種性質, 但是我還是大為震撼

所以答案為

\[\sum_{i = 1, i \neq root}^{n} f_{i, 1} \times 2 ^ {m - Size_x} + f_{root, 1} \times 2 ^ {m - Size_x + 1} \]

太有實力啦

考慮遞推

首先我們需要知道, 如果對於 \(x\) 的子樹 \(son\) , 其中 \(son\) 內部有軍營, 那麼 \(x \to son\) 這條邊必須要守, 其他無所謂

所以有

\[f_{x, 1} \gets f_{son, 1} \times f_{x, 0} + f_{son, 1} \times f_{x, 1} \]

\[f_{x, 0} \gets f_{x, 0} \times f_{son, 0} \times 2 \]

\[f_{x, 1} \gets f_{x, 1} \times f_{son, 0} \times 2 \]

初始化

\[f_{x, 0} \gets 1, f_{x, 1} \gets 2 ^ {Siz_x} - 1 \]

注意這裡表示的是隻選 \(x\) 這一 \(\rm{e}\)-\(\rm{DCC}\) 中點的可能性, 反正可以隨便選, 邊隨便選的情況在計算答案時統計

程式碼

後補

總結

神秘計數方法

\(\rm{dp}\) 式子考慮不到的, 可以在統計答案時考慮

注意計數不重不漏, 注意初始化

相關文章