LY1155 [ 20230320 CQYC省选模拟赛 T2 ] 草
题意
定义一个数列 \(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)\)。