1. 程式人生 > >訓練記錄PART7

訓練記錄PART7

再不更部落格我就……!!!……吃cjb!

T112-2018 Bytedance-MW Wintercamp Selection Contest C

  題意:給出一棵 \(N(\leq 10^6)\) 個點的帶邊權的樹。甲乙兩人輪流博弈,每次可以選擇將一條邊 \(e\) 的邊權 \(w_e\) 減一。若減完後變成 \(0\),則割掉不包含根的那個連通塊。雙方執最優策略,問先手是否必勝。如果必勝的話,還要輸出所有可行的第一步刪邊方案。
  題解:如果邊權 \(w_e=1\),有一個很簡單的結論:子樹 $sg_x=(sg_{y_1}+1) \oplus (sg_{y_2}+1) \dots $。這個可以用歸納法來證明。
  此題中邊權可以大於 \(1\)

。事實上,還有一個一般性的基於圖的做法。
  連結可參考這裡:([https://blog.csdn.net/acm_cxlove/article/details/7854532)。
  主要思想是基於對原圖進行等價變換。
    等價變換①:偶環可以“縮成”一個點(偶環裡的邊將變成這個點的子環)。
    等價變換②:自環可以拆成一個新的兒子。
  直接將此題的樹看成圖,可以發現子樹 \(sg_y\)\(sg_x\) 的貢獻是 \(sg_y \oplus [w_{x,y} \nmid 2]\) 。特殊情況是 \(sg_y+1[w_{x,y}=1]\)
  第二問相當於,我們要將某一條邊減少一,使根的 \(sg\)
變為 \(0\)。直接 \(DFS\) 下去,每次維護需要將當前的 \(sg\) 變成多少才能合法。