CF1479D
题目大意:
给定一棵树,每个点有权值,有 \(q\) 次询问。
\(q\) 次询问每次给定 \(u, v, l, r\),表示查询 \(u\) 到 \(v\) 路径中权值在 \(l \sim r\) 中出现次数为奇数的人任意一个数。
\(n, q \le 3 \times 10^5\)
解题思路:
Solution A:
看到 “出现次数为奇数”,想到树上莫队。
这和树上莫队 dfn 序上出现次数为奇数的数才有效是对应的。
修改时要维护每个块中是否有出现为奇数的数。
那么就能保证 \(O(1)\) 修改,\(O(\sqrt{n})\) 查询。
\(O(n^{1.5})\)
没写,但应该要卡常。
Solution B:
因为他要求输出任意一个数,所以树上莫队的可以统计次数是浪费了的。
所以应该有低于 \(O(n \times \sqrt{n})\) 的做法。
考虑出现次数为奇数的数才有效。
不仅仅和树上莫队互相对应,还和集合有点关系。
具体来说就是将每次插入的数看成将他的出现次数异或 1。
那么联想到 Xor-Hash。
路径是不好做的,我们可以将它拆成 \(X+Y-LCA-fa_{LCA}\) 的形式。
那么考虑预处理出每个点到路径的 hash 结果。
用主席树就可以做,因为 \(x\) 从 \(fa\) 那里只会修改 \(\log\) 个数。
那么如果一段区间内没有出现次数为奇数的,那么他的异或和就应该等于 0。
主席树二分即可。
\(O(n \log n)\)。

浙公网安备 33010602011771号