生活在树上(hard version) 树上差分
-
前言 : 生活在树上——始终热爱大地——升上天空。
-
题目 : 生活在树上(hard version)
-
大致题意 :
给出一颗 \(n\) 个节点的树, 每个点 \(u\) 有权值 \(w_u\) , 有 \(m\) 个询问, 求两个节点 \(u, v\) 之间的路径上是否有一个点 \(t\) 满足所有 路径 \((u, t)\), \((v, t)\) 所经过的所有结点权值异或和为 \(k\) 。
其中 \(n \leq 10^5, m \leq10^5,w_i \leq10^7\)。
-
思路 :
考虑记录 \(dist_u\) 为根节点到 \(u\) 的结点权值异或和, 然后可以套路地转化为求路径 \((u,v)\) 上有没有点 \(t\) 其权值为 \(k \oplus dist_u \oplus dist_v \oplus w_{lca(u, v)} = w_t\) 。
然后我们发现路径也是可以树上差分, 拆出来 \(u, v, lca(u, v), fa_{lca(u, v)}\) 到根节点的路径, 然后开一个桶去计数即可, 结合倍增时间复杂度 \(O(n \log_2 n)\) 其时间复杂度瓶颈在于求最近公共祖先。
登高自卑,行远自迩。

浙公网安备 33010602011771号