hihoCoder挑战赛25

官方题解

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)  评论(0编辑  收藏  举报