dfs+动态维护trie、二进制trie概念、动态维护当前节点与树根的路径


LINK

一棵树(n个点,n-1条边),每个节点编号是[0, n-1]

有m个查询,每个查询:{i, k},为[root 到 i]的路径上的节点号j, 最大的j ^ k

在这里插入图片描述
比如有一个查询是:[3, 7]
root 到 3,的路径上的点,有: 0, 1, 3 , 答案为:max(0^7, 1^7, 3^7) = 0^7 = 7

n=1e5, m=1e5, k=1e5


首先第一个问题,对于i号节点,如何得到root到i的路径上,所有点??
其实,这就是dfs 在维护的!!! dfs就是维护的root到i的路径!!

当然,前提是 你必须非常熟悉dfs原理。
在这里插入图片描述
比如说我们当前是在6,我们想要得到[1, 3, 6]这个路径
你很容易错误的认为: 我们当前维护的是[1,2,4, 3,5,6]
这个绿色的,是dfs 遍历过的点,即最朴素的dfs 维护的是 绿色路径

而我们想要得到红色路径,就需要做特殊处理。
因为dfs是函数递归,可以进行回溯
当dfs到6时,之前dfs的2,4,5,就都回溯掉了!!!
所谓回溯掉,即 当dfs一个节点时 加入路径,当dfs离开一个节点时,从路径中去除该点

void dfs(int cur){
   
	add_path( cur );
	
	'此时,path里的节点,就是[root 到 cur]路径上的所有点!!!'
	
	FOR(j : cur的儿子){
    dfs(j); }
	
	del_path( cur );
}

代码很短,但一定要仔细理解!!
dfs的一个功能是: 在一个树,动态的维护[root到cur]路径上的所有点


能看到dfs这个性质,问题就简单了…

你现在得到了path,即找path里 ^ k的 最大值,可以使用trie

二进制trie树基础

trie: 支持 add 和 remove操作,都是log(k) = trie树高度

FOR(i, 0, que.size()-1, 1){
   
	record[ que[i][0] ].PB( {
   que[i][1], i
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值