Link
Solution
当然首先把XOR前缀和,转换成在中找两个元素使它们的XOR最大。 这种分块的套路好像都差不多啊。 对于每个块的块首元素,表示点和区间中元素的XOR最大值,用可持久化Trie。 对于每个询问,分成两部分,其中是后面的第一个块首元素。后半部分已经预处理,前半部分只需要枚举每个数,查找它在区间中的最大XOR值。
Tips
分块思想一种套路。
把int右移32位会爆炸,会出来1!!切记!!
Code
1 | //Code by Lucida |
当然首先把XOR前缀和,转换成在[l−1,r]中找两个元素使它们的XOR最大。 这种分块的套路好像都差不多啊。 对于每个块b的块首元素head[b],f[b][i]表示点i和区间[head[b],i]中元素的XOR最大值,用可持久化Trie。 对于每个询问[l−1,r],分成两部分[l−1,head[b]−1],[head[b],r],其中head[b]是l后面的第一个块首元素。后半部分已经预处理,前半部分只需要枚举每个数,查找它在区间[l,r]中的最大XOR值。
分块思想一种套路。
把int右移32位会爆炸,会出来1!!切记!!
1 | //Code by Lucida |