链接:E - Tree Xor
题意:
有一颗节点数为 n 的树 , 现给出每个节点权值的范围 [ l i , r i ] [l_i , r_i] [li,ri],以及每条边两端点的异或和。求点的权值有多少种不同的取值。
思路:
-
首先我们可以发现确定一个点的权值后,所有的的权值就都确定了 , 所以我们先让1号节点的权值为 0 , 求出其它所有点的权值 w i w_i wi。这样我们给1号节点异或上 a 后,就相当于给其它每个节点也异或 a 。这样我们就可以求出 a 的 n 个限制 w i ⨁ a ∈ [ l i , r i ] w_i\bigoplus a\in[l_i , r_i] wi⨁a∈[li,ri]。这样我们就可以求出 a 的一些取值区间 , 只要 a 同时满足 n 个限制就可以得到一组答案。
-
这题的关键就是怎么求出满足 w i ⨁ a ∈ [ l i , r i ] w_i\bigoplus a\in[l_i , r_i] wi⨁a∈[li,ri]的 a 的取值区间。有一种比较容易理解的方法就是类似于字典树的查询是的递归写法 。 也就是求 a ⨁ w i ≤ r i a\bigoplus w_i\leq r_i a⨁wi≤ri的 a 的范围,就直接分类讨论一下就好了,可以参考下面的代码。同时求出 a ⨁ w i ≤ l i a\bigoplus w_i\leq l_i a⨁wi≤li<