LOJ #2206. 「HNOI2014」世界树(虚数,长链剖分O(1)求k级祖先)

题目
虚树显然,
一次从下到上 d p dp dp求子树内能到该点的最优的临时议事处。
一次从上到下 d p dp dp求子树外能到点 u u u的父亲的最优的临时议事处。
然后两个加一下除个二,
树上找 k k k级祖先即可。
长链剖分 O ( 1 ) O(1) O(1) k k k级祖先:
O ( n log ⁡ n ) O(n\log n ) O(nlogn)预处理所有点的 2 j 2^j 2j级祖先。
再对于每个长链链头,处理链头向上长链长度级的父亲数组 g g g
那么我们对于求 u u u k k k级父亲。
u u u先跳 2 r 2^r 2r步,其中 2 r ≤ k < 2 r + 1 2^r\le k<2^{r+1} 2rk<2r+1
然后我们再跳 k − 2 r k-2^r k2r步,到达点一定在现在的 u u u在的长链所记录的 g g g或者就在这一条长链上, O ( 1 ) O(1) O(1)算即可。
这个过程除了预处理都是可以 O ( 1 ) O(1) O(1)
但是好像没有纯树剖快
A C   C o d e \mathrm {AC \ Code} AC Code

#include<bits/stdc++.h>
#define maxn 300005
#define lim 19
#define rep(i,j,k) for(int i=(j),LIM=(k);i<=LIM;i++)
#define ADJ(i,u) for(int i=info[u],v;i;i=Prev[i])
#define Ct const 
#define inf 0x3f3f3f3f
using namespace std;

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值