题意
区间两数异或在二进制下有 k k k 个 1 1 1 的对数。
Sol
普通莫队的话,如果要实时维护好区间内的答案需要支持区间对一个数求答案。
直接做不是很好做,容易发现其实这也就是一个区间询问。那么可以把莫队中要求的东西再次离线下来。
我们把上述询问拆成前缀相减的形式,这样我们要做到就是多次询问一个前缀对一个数的答案。
由于在数据范围下二进制下有 k k k 个 1 1 1 的数并不是太多,我们可以直接从前往后做,遇到一个数 x x x 则把 x ⊕ n u m b e r ( k ) x\oplus number(k) x⊕number(k) 加入桶中 ( n u m b e r ( k ) number(k) number(k)表示二进制下有 k k k 个 1 1 1的数)。当我们遇到一个询问 数 y y y 和当前前缀的答案时,只需要看 y y y 的桶被加入了多少个数就行了。
复杂度分析: 由于询问个数和莫队移动次数同阶,为 O ( n n ) O(n\sqrt n) O(nn) ,查询复杂度是 O ( 1 ) O(1) O(1) 的所以查询复杂度就是 O ( n n ) O(n\sqrt n) O(nn<