P4211 [LNOI2014]LCA 题解

设询问 ( l , r , z ) (l,r,z) (l,r,z) 表示 ∑ i = 1 r d e p [ L C A ( i , z ) ] \sum_{i=1}^{r}dep[LCA(i,z)] i=1rdep[LCA(i,z)]

首先先对询问式做一个差分:

( l , r , z ) = ( 1 , r , z ) − ( 1 , l − 1 , z ) (l,r,z)=(1,r,z)-(1,l-1,z) (l,r,z)=(1,r,z)(1,l1,z)

那么我们可以考虑将一个询问 ( l , r , z ) (l,r,z) (l,r,z) 拆成两个询问 ( 1 , r , z ) (1,r,z) (1,r,z) ( 1 , l − 1 , z ) (1,l-1,z) (1,l1,z)

然后思考对于形如 ( 1 , r , z ) (1,r,z) (1,r,z) 的询问怎么计算贡献。

注意到对于 d e p [ L C A ( x , z ) ] dep[LCA(x,z)] dep[LCA(x,z)] 我们可以这样处理:先将根节点到 x x x 的路径上所有点点权加一,然后查询根节点到 z z z 路径上的点权和。所有点初始为 0。

这个正确性是对的,参照下面 3 张图理解即可。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

这样单次询问就解决了。

对于所有的 ( 1 , r , z ) (1,r,z) (1,r,z) 询问,我们首先按照右端点排序,排序完成之后用一下树剖,我们就可以做到独立 O ( n log ⁡ n ) O(n \log n) O(nlogn) 完成区间加操作。

路径询问?也是树剖可以完成的。

不考虑预处理复杂度,总询问复杂度是 O ( q + n log ⁡ n ) O(q+n \log n) O(q+nlogn)

Code:GitHub CodeBase-of-Plozia P4211 [LNOI2014]LCA.cpp

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值