P4839 P哥的桶C++题解

题目传送门

分析

看到查询最大异或和,果断想到线性基,又看到了区间操作,果断想到线段树。

于是就有了线段树套线性基。

对于插入操作,我们可以对线段树上对应的点的线性基直接插入。

对于询问操作,我们可以将区间内的线性基并在一块查询。

代码如下

#include
using namespace std;
int read(){
	int x;scanf("%d",&x);return x;
}
const int N = 5e4+100;
int n,m;
struct Node{
	int p[34];
	int size;
	Node(){size = 0;}
}t[N<<2];
int Ans[34],size;
void update(int u,int l,int r,int K,int x)
{
	if(l > K || r < K) return;
	int key = x;
	if(t[u].size < 31)
	{
		for(int i = 31;i>=0;i--)
		{
			if(key&(1<> 1;
	update(u<<1,l,mid,K,x);
	update(

你可能感兴趣的:(线段树,线性基,c++)