【题解】LOJ6144 C

题link

考虑只有询问的情况,经典的主席树/可持久化01trie,考虑有位运算大概是在 01trie 上搞事,于是对于每一位考虑其对 01trie 的影响。

或:或 0 没用,或 1 等价于把当前位的所有点左儿子合并到右边

与:与 1 没用,或 0 等价于把当前位的所有点右儿子合并到左边

异或:异或 0 没用,异或 1 等价与把当前位的所有点交换左右儿子

于是发现合并儿子后就空了一边,再合并就是交换位置,所以每一位等于是只和并一次。

易发现交换位置很容易能在查询时特判,换个边就好了。

所以每次需要合并时暴力重新建 01trie,然后记录每一位是否相同、相同时是 0 还是 1、是否交换就能直接查了(代码中分别为 sam,whi,rev (same,which,reverse))。

我写的实现是合并统一合到右子树,算答案时用看 whi 标记是 0 还是 1,有 rev 的位就当做左右子树反了的做,具体实现见代码。

时间复杂度:最多暴力重构 \(O(\log A)\) 次,每次 \(O(n\log A)\),不重构的修改 \(O(1)\),询问 \(O(\log A)\),总复杂度为 \(O(n\log^2 A + m\log A)\)\(A\) 为值域)。

代码link

posted @ 2022-01-07 17:46  WhaleAtCola  阅读(93)  评论(0编辑  收藏  举报