[计数] [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)\)

posted @ 2026-01-12 20:14  Zwi  阅读(1)  评论(0)    收藏  举报