bzoj5466: [Noip2018]保卫王国

这题和luogu模板几乎一模一样


暴力就是将每次dp一遍,将特殊点特判

f [ i ] [ 0 ] = ∑ f [ s ] [ 1 ] f[i][0]=\sum f[s][1] f[i][0]=f[s][1]

f [ i ] [ 1 ] = ∑ min ⁡ ( f [ s ] [ 0 ] , f [ s ] [ 1 ] ) f[i][1] = \sum \min(f[s][0],f[s][1]) f[i][1]=min(f[s][0],f[s][1])

如果一个点必选,可以将它的值改成 − ∞ -\infty ,必不选可以改成 ∞ \infty

然后考虑动态dp

g0表示除了重儿子这个点不选的最小代价,g1表示选这个点的最小代价

然后重链上的信息可以用线段树维护,构造一个矩阵

[ ∞ , g i , 0 g i , 1 , g i , 1 ] ∗ [ f s , 0 f s , 1 ] = [ f i , 0 f i , 1 ] \begin{bmatrix} \infty, g_{i,0}\\ g_{i,1}, g_{i,1}\\ \end{bmatrix} * \begin{bmatrix} f_{s,0}\\ f_{s,1} \end{bmatrix} = \begin{bmatrix} f_{i,0}\\ f_{i,1} \end{bmatrix} [,gi,0gi,1,gi,1][fs,0fs,1]=[fi,0fi,1]
这个矩阵的运算为
c i , j = min ⁡ ( a i , k + b k , j ) c_{i,j} = \min (a_{i,k} + b_{k,j}) ci,j=min(ai,k+bk,j)
修改就是修改这个点到根路径上的每条重链

查询以一个点子树的最大值就是需要查询整条重链

复杂度 O ( 8 n l o g 2 n ) O(8nlog^2n) O(8nlog2n)

这题有更优秀的做法,可以去了解一下

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值