P3345 [ZJOI2015]幻想乡战略游戏

P3345 [ZJOI2015]幻想乡战略游戏

带修改带权重心
这是经典的树上寻找关键点的题目,我们使用点分治处理这个问题,因为点分治的特性,就相当于在树上二分了。但是这与倍增不同,倍增只是在链上二分,而点分治则是在整棵树上二分。

然后我们考虑如何二分,显然带权重心的位置和边权无关,并且每次只需要寻找一个点的 2 s u m v > s u m u 2sum_v>sum_u 2sumv>sumu那么重心一定在这个子树内部。也就是说有一个儿子的答案比当前点小,那么重心就在这个子树内。我们可以维护3个变量。
s u m d sumd sumd:表示当前分治范围内 d u d_u du的总和
s d v : sdv: sdv:表示当前分治范围内 d u d i s ( u , v ) d_udis(u,v) dudis(u,v)的总和
s d v f sdvf sdvf:表示当前分治范围内 d u d i s ( u , f a v ) d_udis(u,fa_v) dudis(u,fav)的总和

然后我们通过跳祖先节点容斥就可以计算出当前点作为重心的答案,复杂度是 O ( l o g n ) O(logn) O(logn)所以查询我们可以从根开始,然后每次遍历所有儿子,查询对应的答案,找到答案最小的,进入它所对应的子树,然后继续这个过程,知道所有儿子的答案都大于等于当前点答案那么就找到了重心。

然后我们考虑如何修改,只会影响到当前点的所有祖先节点,所以我们暴力跳祖先进行修改即可。然后这道题最好使用st表处理lca。

细节错误:

  1. 一定要注意循环终止条件是f[i]!=0,相当于我们每次都是处理f[i]的有关信息
  2. 处理的时候距离计算是dis(x,f[i])而不是dis(i,f[i])
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值