题意是求 【a,b】 中 的最大字段异或和。 。
看了神牛题解才会的。
首先将 区间 转化成 前项和 中两个的异或值。
也就是 将 1- n 个数a[ ],转化成 0-n 个数的数列b[ ]。
也就是
b[ r ] ^ a[ l ] = a[l+1] ^ a[l+2]^...^a[ r ]
b[2] ^ b[ 0 ] = a[1 ]^a[ 2 ]
在查询 【l,r】 转化成 b【】上的 【l-1, r】上的查询。(没处理好 ,一直在b【】 上 查询【l,r】 ,wa 成狗了。。)
于是此题问 就转化成了 在 在区间查询 两个点最大异或值。
对于一个点,查询是 【l,r】 是 复杂度 是 O(nlgm) : m 是 数列中最大值 lgm 是其位数。
所以求区间 任取两个点的最大异或值 ,lgn 应该没有解法。
于是参考神牛的解法, 分块,维护每一块的块头那个点 和其后边的每一个点 代表的区间中的最大值,
每一块块头部点 共有sqrt(n) 个,
f[ i ][j] = max(f[i][j-1],query(idx[i],j)); 第i块到 j的位置的最大值。
预处理的复杂度 O(nsqrt(n)*lgm)
查询时 暴力 第一块。 第二块的开头到 r 已经预处理出来了。
#include
#include
#include