给出一个长度为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<