catalog
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