[计数] [dp] P12059 [THUPC 2025 决赛] I'm Here
posted on 2025-04-20 13:35:38 | under | source
题意:\(n\) 个点的树,\(1\) 为根。保证存在一种 dfs 序为 \(1\dots n\)。对每个 \(k\in [1,n]\),求满足如下性质的数列 \(p\) 个数:
- \(p\in [1,n]\) 且互不相同。
- \(i<j\) 则 \(p_i\) 不为 \(p_j\) 的祖先。
- \(p_i\le n-i+1\)。
前两个限制为拓扑序计数,有平方的树上背包做法。但由于该做法是“插入计数”的,所以难以维护第三个限制,因为需要具体位置而非相对位置。
实际上插入的过程是很自由的,能否通过适当的插入顺序,来规避这个问题呢?
尝试简化限制三,注意到 \(i<j\) 且 \(p_i<p_j\) 则 \(i\) 受到的限制肯定比 \(j\) 更紧,因为非法后缀更小且位置更左。这启发我们从大到小插入元素。
记 \(f_{i,j}\) 为元素 \(\ge i\) 且最右一个位置在 \(j\) 的方案数。对于 \(i-1\),假如插入在最右边,其祖先不可能被操作,易处理;否则无需考虑限制三,但是可能影响 \(i-1\) 子树内的元素,整体考虑该子树的方案再归并回去即可,因为该子树的元素整体偏小所以结论仍成立。
预处理 \(g_{i,j}\) 为子树内 \(j\) 个点拓扑序数量即可。转移是朴素的,简单前缀和优化为 \(O(n^4)\)。

浙公网安备 33010602011771号