模拟测试53

T1:

  我们不仅可以维护差分,还可以维护差分的差分,两次前缀和即可。

  注意区间可能延伸到矩形之外,特判一下即可。

  时间复杂度$O(n^2)$

T2:

  可以状压DP或记忆化搜索。

  记录状态为当前哪些小球被拿走了,然后逆推转移就行了。

  但是小球的颜色只有两种,我们可以将状态定义重设为剩下小球的颜色。

  这样大大减少了状态数。

  时间复杂度$O(nk2^{C_n^k})$

T3:

  DP神题。

  根据贪心思想,一条边至多会被覆盖一次。

  因为如果一条边被两条路径覆盖,从这条边两侧截开这两条路径一定能使答案更优。

  以二元组的形式进行DP,要在first尽可能小的情况下使second尽可能小。

  设$dp[i][0/1]$表示在以$i$为根的子树内,有/无向上延伸的路径的方案数。

  则对于每个节点,我们可以将所有儿子延伸上来的路径两两匹配,只有最大化匹配,first才会尽可能优。

  就用两个变量$now1$与$nxt1$和$now2$与$nxt2$分别滚动记录该节点有奇数个路径和有偶数条路径的最优值。

  $now1$初值为$inf$,$now2$初值为$0$,枚举所有儿子:

    $nxt1=min(now1+dp[y][0],now2+dp[y][1])$

    $nxt2=min(now1+dp[y][1],now2+dp[y][0])$

    $now1=nxt1,now2=nxt2$

  实质上就是对所有儿子进行匹配,求出最优方案。

  然而方案是分奇偶的,如果当前儿子中有偶数条路径,不延伸的情况更优,反之延伸的情况更优。

  然后讨论该点的限制,考虑该点是否可以向上延伸,是否必须向上延伸。

  上面的$now1$及$now2$仅考虑了子树内部,用加一调节即可。

  时间复杂度$O(n)$

posted @ 2019-09-28 11:59  hz_Rockstar  阅读(387)  评论(0编辑  收藏  举报