[dp 記錄]agc016F Game on DAG
阿新 • • 發佈:2022-12-11
博弈論好題,做完感覺加深了對 SG 函式的理解!
題意:
給定一張 DAG,問該 DAG 的 \(2^m\) 張匯出子圖中有多少張滿足 \(SG[1]=SG[2]\)
注:此為轉換後題意
\(n \leq 15\)
考慮推出 SG 的過程,執行一遍拓撲排序,取 \(\operatorname{mex}\)。
按 \(SG\) 函式值把點分層,則一個 \(x\) 層點需要連所有 \(y < x\) 層點各至少一個。
dp 中重要的是找到答案的一個遞推式的形式,發現任意合法答案都能用這種子小形式表達出來。
對於 CSPS2022 T3,發現一個合法的連通塊是從多點往上到共同 lca 的路徑並,據此分開考慮空 / 全部連到 lca 處。
\(n\) 這麼小,子集列舉是少不了了。那麼需要 \(f_S\) 表示只考慮集合 \(S\) 中的點,且 \(1,2\) \(SG\) 值相同。然後會發現從後往前列舉是行不通了,因為 \(1,2\) 可能連向任意點,需要存任意點的 \(SG\),於是考慮從後往前,每次批量把 \(SG=0\) 的點加進來。
形式化地,假設現在列舉到 \(S\),欽定 \(S\) 的子集 \(U\) 的 \(SG=0\),\(T=S/U\),則以下條件應當被滿足:
- \(1,2\) 屬於一個集合
- \(U\) 集合內部不能連邊
- \(U \to T\) 任意連邊,\(T\) 中任一點與 \(U\) 中有連邊
預處理 \(c_{x,S}\)
部分借鑑於 官方題解