CF757G Can Bash Save the Day? 题解

CF757G Can Bash Save the Day?

时间复杂度分析好题(大雾)。

将询问拆成几部分,也就是 d i s ( u , v ) = d e p ( u ) + d e p ( v ) − 2 ∗ d e p ( L c a ( u , v ) ) dis(u, v) = dep(u) + dep(v) - 2 * dep(Lca(u, v)) dis(u,v)=dep(u)+dep(v)2dep(Lca(u,v))

显然对于 L c a Lca Lca 我们直接进行树链剖分即可。

我们对于每一个 v v v 维护 ≤ l \le l l d e p ( L c a ) dep(Lca) dep(Lca) 的贡献,为了节省空间我们直接使用可持久化线段树,进行插入的时候使用标记永久化。

具体来说就是将 [ l , r ] [l, r] [l,r] 这个 d f s dfs dfs 序的区间进行 + 1 + 1 +1 意味着,整个区间加上了 s u m d e p r − s u m d e p l − 1 sumdep_r - sumdep_{l - 1} sumdeprsumdepl1 的贡献,之后为了保证线段树的复杂度是 log ⁡ n \log n logn 我们直接在这里记录标记了几次。然后在进行查询的时候直接下传还有多少次标记没有传完即可。直接像普通线段树下传标记会出现下传了不是属于当前线段树节点的情况。

对于修改的话,发现前缀和只有一个位置变了,也就是只需要修改一个位置。

然后因为本题是卡空间的,我们考虑一次加入点是 log ⁡ n \log n

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值