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
- ...