官方题解
A. Rikka with Tree
- 树dp
- \(dp(i,j)\)表示子数 \(i\)得到 \(j\)个联通块的最小操作次数。
- 代码
B. Rikka with Tree II
- 直观的做法是 \(dp(i,j,k)\) 以 \(i\) 为根,包含前 \(j\) 个点,\(i\) 是否还是儿子节点的方案数,时间复杂度为\(O(n^3)\)。
- n^3 code
- \(O(n^2)\) 的做法,\(dp(i,j)\) 表示操作到第 \(i\)个点,还有 \(j\)个位置要填的方案数,根据\(i+1\)的状态进行转移。
C. Rikka with Tree III
- 这里只讲一个点在子树内,另一点在子树外的细节做法。
- 问题利用\(dfs\)序,相当于统计一个区间内数的出现状态以及区间外的数的出现情况。
- 假设\(bit\_in\)表示区间内部的数的状态,\(bit\_out\)表示外部数的状态,当前中间节点的权值为\(w\)。
- 如果较大值在\(bit\_out\)内,则\(bit\_out >> w\)可以得到可能的公差\(d\)。
- 较小值与\(w\)的公差不能直接右移得到,则\(bit\_in\)需要存储\(N-w_i\),此后通过\(bit\_in >> (N-w)\)计算公差\(d\)。
- 两个集合的公差取交集,最后的答案取并集即可。
- 代码
D. Rikka with Lattice
posted @
2017-04-02 21:02
mcginn
阅读(
97)
评论()
编辑
收藏
举报