bzoj-3261 最大异或和

题意:

给出一个长度为n的初始序列,和m次操作;

A操作:在序列后面加入一个数;

Q操作:给出一段区间[l,r]和一个数x,求区间中的p使p的后缀异或和与x的异或值最大;

n,m<=300000;


题解:

可持久化数据结构(2/4)进行中... ...

先做一个转化,因为是在序列后面加数,维护后缀和并不容易;

但是由于异或性质可以转化成前缀和的问题;

也就是在区间中选一个数,使其与另一个数的异或值最大;

这显然是一个trie树的经典问题,但是这里涉及到了区间问题;

那么如果对每个区间搞棵trie树就解决了;

之后上可持久化就结束了,记录trie树上每个结点被经历的次数,以记录这个结点是否在区间内;

询问时下标似乎需要一点特判,处理的有点恶心了但是不太影响吧;

复杂度O(25(n+m));


代码:


#include
#include
#include
#define N 610000
using namespace std;
struct node
{
	int next[2],sum;
}a[N*30];
int root[N],tot;
char str[10];
void Insert(int x,int &p,int d)
{
	a[++tot]=a[p];
	p=tot;
	a[p].sum++;
	if(d==-1)	return ;
	Insert(x,a[p].next[(x&1<a[a[nol].next[!index]].sum)
		return 1<




你可能感兴趣的:(bzoj,数据结构,OIer刷题记录)