[GXOI/GZOI2019]旧词

题目

传送门 to luogu

思路

直接做是很困难的。

考虑这样构造一个可以做的实值函数 v ( x ) v(x) v(x) ,满足 ∑ u ∈ P a t h ( x , r o o t ) v ( u ) = d e p t h ( x ) k \sum_{u\in Path(x,root)}v(u) = depth(x)^k uPath(x,root)v(u)=depth(x)k

也就是说,每个祖先(包括自己)的 v v v 之和,恰好为 d e p t h ( x ) k depth(x)^k depth(x)k

如果我们成功的构造了这样的函数,显然, d e p t h ( l c a ) k depth(lca)^k depth(lca)k 就被 分摊到了 l c a lca lca 到根的路径上

此时,我们只需要求 ∑ u ∈ P a t h ( Y , r o o t ) v ( u ) c n t ( u ) \sum_{u\in Path(Y,root)}v(u)cnt(u) uPath(Y,root)v(u)cnt(u)

其中 c n t ( u ) cnt(u) cnt(u) 表示以 u u u 为根的子树中,有多少个点编号在 [ 1 , X ] [1,X] [1,X] 范围内(此 X X X 为询问中的 X X X )。

其实这是很显然的,不妨看图:
在这里插入图片描述
此时, l c a ( y , x 1 ) lca(y,x_1) lca(y,x1) 的值已经被分摊到了其到根的路径上——因为这个点的每个祖先的 c n t cnt cnt 都增大了 1 1 1 (并且被 y y y 所计算到了),所以总贡献就是其祖先(包括自己)的 v v v 之和,也即其 d e p t h k depth^k depthk x 2 x_2 x2 同理。

那么这个 v v v 应该是多少呢?其实很简单,构造一个即可: v ( x ) = d e p t h ( x ) k − [ d e p t h ( x ) − 1 ] k v(x)=depth(x)^k-\left[depth(x)-1\right]^k v(x)=depth(x)k[depth(x)1]k

正确性是显然的。这里我们充分运用了 d e p t h ( x ) − 1 = d e p t h ( f a x ) depth(x)-1=depth(fa_x) depth(x)1=depth(fax) 的特点。

然后我们就可以做了!只需要 树链剖分(或者 L C T LCT LCT )即可。

按照 X X X 排序,每次插入,只是维护一个 c n t cnt cnt (和 c n t × v cnt\times v cnt×v )而已。毕竟 v v v (及 v v v 的和)可以预处理。

代码

咕咕咕……
我真的不想打了……
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值