模拟测试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)$