题目地址:https://codeforces.com/contest/1100/problem/F
题目:
多次查询区间的最大异或值,但是数据范围比较大,5e5个数,5e5个查询
解题思路:
用线段树维护区间线性基,果然T了,T在第19个test
感觉这道题其实和https://blog.youkuaiyun.com/Cassie_zkq/article/details/96448531的做法有点类似,对于区间查询都是先离线处理,然后区间的右边界一定,依次寻找答案
参考网上的代码,这道题可以不用对右边界排序,存储方法比较巧妙。
对于每个行阶梯矩阵的每一行,采用后入为主的思想,如果j行已经有数了,那么就让新的数取代原来的数,让新的数和原来的数异或,之后再向后位查询可以放置的位置,并记录行阶梯矩阵每行的pos值,即若该行的值是由a[i],a[k]..a[m]异或出来的,让pos=最小的下标。
在右边界一定的前提下,统计每个区间的最大异或值
ac代码:
#include <bits/stdc++.h>
using namespace std;
const int maxn = 5e5