1. 程式人生 > 其它 >[dp 記錄]agc016F Game on DAG

[dp 記錄]agc016F Game on DAG

博弈論好題,做完感覺加深了對 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}\)

表示 \(x\)\(S\) 集合連邊總數,則第三條件的貢獻為 \(\displaystyle\prod_{t \in T} (2^{c_{t,U}}-1)\prod_{u \in U} 2^{c_{u,T}}\),乘上 \(f_T\) 即可貢獻給 \(f_S\)。總複雜度 \(O(n 3^n)\)

部分借鑑於 官方題解