題意
定義一個數列 \(a\) 是好的,滿足 \(\forall i \in [0, k], a_i = \sum_{j = 0} ^ k [a_j == i]\)。
對於一棵樹,求出多少滿足權值好的數列。
Sol
yy一下感覺好的序列不會很多。
寫個 \(dfs\) 搜出 \(k \le 8\) 的所有的好的序列。
發現一個數列是好的當且僅當:
- \(a = 1, 2, 1, 0\)
- \(a = 2, 0, 2, 0\)
- \(a = 2, 1, 2, 0, 0\)
- \(a = k - 4, 2, 1, 0, ..., 1, 0, 0, 0\) (中間省略 \(k - 7\) 個 \(0\))
證明可以自己感性理解下。
前面三個長度 \(O(1)\),直接暴力樹形dp即可。
第四個數列是個經典的點分治。
注意到不好匹配的原因在於中間 \(O(n)\) 級別的 \(0\),其實可以考慮用一個並查集來跳 \(0\)。
考慮對於每個權值為 \(0\) 的點,對她的父親連一條邊。
這裡似乎只能寫路徑壓縮或者按秩合併。
總複雜度 \(O(n \log ^ 2 n)\)。