题目
n(n<=1e5)个点,第i个点上有个权值vi(0<=vi<=1e9)
q(q<=1e5)次询问,每次询问给出u和x,
要求选择u的子树的一个节点y,使得y的权值异或x最大,
输出这个最大值
思路来源
https://www.cnblogs.com/LQLlulu/p/9496426.html
题解
按dfs序将树压成线性序列,子树的权值就是一段连续的序列
对线性序列建可持久化01字典树,
询问u的子树的时候,就是[in[u],out[u]]这段序列对应的01字典树的最优解
在该01字典树上贪心地跑,能反则反,被迫同则同,贪心地选
注意开始建一条全0的链,但似乎题意没说可以不选???
心得
要习惯这种开若干个数组建数据结构的代码吧
毕竟数组来模拟数据结构,往往无敌,不会被卡空间,也很少被卡时间
学了一下可持久化01字典树,算是对可持久化结构理解更深了一步吧
总之就是用的时候动态开点,查询时候两条链在同一节点一起向下跑
代码
#include
#include
#include
#include
#include
#include
#include