树链剖分

woj 651 点击打开链接

这是去年校赛的一道题,操作只有一种,就是将x-y的节点全部加k,最后求最大的节点。很裸的树链剖分,但恶心的是出题人卡了常数树链剖分会超时。注意这道题只有一次询问,我们可以使用树上前缀和离线处理。将x-y的节点加k,就是相当于将x+k,y+k,lca(x,y) - k, father(lca(x,y)) - k(和树状数组的区间修改,单点查询一个道理)。一遍dfs用tarjon就可以完成所有的操作,再用一次dfs求出最大子树和即可。

CF 960H 点击打开链接

这道题过的人很少,但我觉得没有看上去那么难。由于每次查询只涉及一种颜色,因此可以一次将所有操作读入,之后每种颜色分开处理。那么这道题就变成了这三种操作:1.将x节点涂上颜色 2.擦掉x节点的颜色 3. 求E(k)的期望

用sum[x]表示以x为节点的子树中带颜色的节点个数,稍作分析可知难点在于维护sigema(sum[x] ^ 2),设该值为t。若将x节点图上颜色,则从x节点到根节点的sum值都会加1,用k代表这些节点。则它们由原来的sum[k] ^ 2变为了(sum[k] +1) ^2 = sum[k] ^ 2 + 2 * sum[k] +1,很显然t值变化了sigema(sum[k]) + deep(x),同理擦掉一个节点也是类似的。这样就只需要能求出x节点到根节点的sum值并且能动态修改sum值就行了,树链剖分即可。

这道题实现上还有很多细节,比如求sigema(sum[x] ^ 2)的初始值时不能暴力dfs,因为颜色太多了会T,还是把它当做涂颜色的操作用树链剖分做。还有就是每次开始处理新的颜色时,线段树不能暴力清空,可以在根节点打一个清0标记,它的优先级是最高的。


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值