生活在树上(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)\) 其时间复杂度瓶颈在于求最近公共祖先。

  • 代码

posted @ 2022-04-19 14:04  Cust10  阅读(109)  评论(0)    收藏  举报