题意简述
给定一颗$n<=20000$个点的树,点带点权,不超过$2^{60}$。还有$Q<=200000$个询问,每次询问两个点之间路径上的最大异或和。
思路
$B[i][k]$表示从$i$往上$2^k$个节点组成的线性基。$LCA$的时候线性基合并就珂以了。带三个log,两个是$log2^{60}$,一个是$logn$。也就是$O(200000\times 60\times 60\times 16)$。虽然看起来有$1e9$,但是你相信我那两个$60$乘不满。所以你能过。在$bzoj$的机器上写面向对象都能过。
代码细节
这题重在模拟。代码细节蛮多的。
- lca的第一步,跳到同一高度,判断条件是deep[fa[u][k]]<=deep[v]
- lca的最后一步,要把val[u],val[v],val[fa[u][0]]的值都插入进来。联想一下求最小值你就明白这步了
- 好像没了?代码还是蛮长的,别写挂别的地方即珂
代码
1 |
|