CF 705 題解
A Hulk
模擬即可.
B Spider Man
打 sg 表可以發現, 奇數個球先手必敗 (sg=0), 偶數先手必勝 (sg=1). 多個組合只要把 sg 值異或起來就好.
C Thor
暴力模擬就可以了, 用佇列模擬.
D Ant Man
結論: 按照編號由小到大加入連結串列, 每次儘量讓答案最小貪心就是對的.
若原來是 \(i\rightarrow j\) , 插入 \(k\) (不妨認為 \(i < j\)), 那麼貢獻如下變化:
- i 變大
- 變大到 j
變成:
- i 變大
- 變大到 k
- k 變小
- 變小到 j
從變化量的角度, 你插入了 \(k\), 那麼 變大到 k 和 k 變小 不管插到哪裡去都不變, 唯一的差別就是 變大到 j 變成 變小到 j.
類似的分析, 若 \(i > j\), 可以認為 i 變小 會變成 i 變大.
也就是說, 每次插入, 會新增一個 變大到 和一個 變小, 會把一個 變大到 變成 變小到 或者 把一個 變小 變成 變大.
注意到這些變化是不可逆的, 那麼意味著沒有後效性, 因此貪心是對的.
這篇題解沒有考慮和 \(s\) 和 \(e\) 的邊界情況, 但是據說證明是類似的.
E Black Widow
考慮圖論建模, 把每一個表示式視為一個點, 那麼如果兩個表示式含有相同的變數, 那麼這兩個表示式連一條邊.
這一定是一堆鏈和環, 對於每一個聯通塊 (如果是環就破環為鏈), 然後設前 \(i\) 個表示式的異或和為 \(j\), 當前公用變數值為 \(k\) 的方案數為 \(f_{i,j(0/1),k(0/1)}\), 最後把每個連通塊揹包合併即可.