bzoj3261 可持久化trie
容易想到题解。
总结一下区间异或和题:
1.转化成trie
2.注意空间稍微开大
3.不要一个数右移31位
4.考虑开头要不要插一个零
5.注意可持久get的时候区间是左开右闭,但这样会变成x-2,x=1时有问题,将x-2=-1的情况变到n+1
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <cctype>
using namespace std;
typedef long long LL;
const int M=600030;
inline int rd(){
int x=0;bool f=1;char c=getchar();
for(;!isdigit(c);c=getchar())if(c=='-')f=0;
for(;isdigit(c);c=getchar())x=x*10+c-48;
return f?x:-x;
}
int n,m;
int a[M];
int root[M];
int ch[M*26][2];
int sz[M*26];
int tot;
int cpynode(int x){
tot++;
ch[tot][0]=ch[x][0];
ch[tot][1]=ch[x][1];
sz[tot]=sz[x]+1;
return tot;
}
int ins(int rt,int d){
int tmp,x,y,k;
tmp=x=cpynode(rt);
for(int i=23;i>=0;i--){
k=(d>>i)&1;
y=cpynode(ch[x][k]);
ch[x][k]=y;
x=y;
}
return tmp;
}
int get(int lt,int rt,int d){
int k,res=0;
for(int i=23;i>=0;i--){
k=((d>>i)&1)^1;
if(sz[ch[rt][k]]-sz[ch[lt][k]]>0) lt=ch[lt][k],rt=ch[rt][k],res+=(1<<i);
else lt=ch[lt][k^1],rt=ch[rt][k^1];
}
return res;
}
int main(){
char s[7];
int i,x,y,z;
n=rd(),m=rd();
for(i=1;i<=n;i++) a[i]=rd();
for(i=2;i<=n;i++) a[i]^=a[i-1];
root[0]=ins(root[0],0);
for(i=1;i<=n;i++) root[i]=ins(root[i-1],a[i]);
for(i=1;i<=m;i++){
scanf("%s",s);
if(s[0]=='A'){
x=rd();
n++;
a[n]=a[n-1]^x;
root[n]=ins(root[n-1],a[n]);
}
else if(s[0]=='Q'){
x=rd(),y=rd(),z=rd();
z^=a[n];
printf("%d\n",get(root[(x-2)>=0?(x-2):(n+1)],root[y-1],z));
}
}
return 0;
}
bzoj3261 可持久化trie的更多相关文章
- [BZOJ3261&BZOJ3166]可持久化trie树及其应用
可持久化trie树 可持久化trie树现在想来是比较好理解的了,但却看了一个下午... 相当于对于每个状态建立一条链(或者说一棵trie),求解的时候只要让两个点按照相同的步子走然后看sum的大小关系 ...
- bzoj3261: 最大异或和 可持久化trie
题意:给定一个非负整数序列{a},初始长度为N. 有M个操作,有以下两种操作类型: 1.Ax:添加操作,表示在序列末尾添加一个数x,序列的长度N+1. 2.Qlrx:询问操作,你需要找到一个位置p,满 ...
- Bzoj3261/洛谷P4735 最大异或和(可持久化Trie)
题面 Bzoj 洛谷 题解 显然,如果让你查询整个数列的最大异或和,建一颗\(01Trie\),每给定一个\(p\),按照二进制后反方向跳就行了(比如当前二进制位为\(1\),则往\(0\)跳,反之亦 ...
- BZOJ3261: 最大异或和(可持久化trie树)
题意 题目链接 Sol 设\(sum[i]\)表示\(1 - i\)的异或和 首先把每个询问的\(x \oplus sum[n]\)就变成了询问前缀最大值 可持久化Trie树维护前缀xor,建树的时候 ...
- 【bzoj3261】【最大异或和】可持久化trie树+贪心
[pixiv] https://www.pixiv.net/member_illust.php?mode=medium&illust_id=61705397 Description 给定一个非 ...
- 【bzoj3261】最大异或和 可持久化Trie树
题目描述 给定一个非负整数序列 {a},初始长度为 N. 有M个操作,有以下两种操作类型:1.A x:添加操作,表示在序列末尾添加一个数 x,序列的长度 N+1.2.Q l r x:询问操 ...
- [BZOJ3261] 最大异或和 (异或前缀和,可持久化Trie)
Description 给定一个非负整数序列{a},初始长度为N. 有M个操作,有以下两种操作类型: 1.Ax:添加操作,表示在序列末尾添加一个数x,序列的长度N+1. 2.Q l r x:询问操作, ...
- BZOJ3261 最大异或和 解题报告(可持久化Trie树)
本题链接:https://www.lydsy.com/JudgeOnline/problem.php?id=3261 题目描述 给定一个非负整数序列{a},初始长度为N. 有M个操作,有以下两种操作类 ...
- 【BZOJ3261】最大异或和(可持久化Trie)
题意: 思路:可持久化Trie板子题,支持序列插入和询问 #include<bits/stdc++.h> using namespace std; typedef long long ll ...
随机推荐
- jQuery 的 $("someobjectid”).event() 的绑定
经验证,jquery 的 $("someobjectid”).event()事件绑定,如果放在某个会被重新初始化的对象里,就会被多次绑定. 如下 <div id="divID ...
- MyBatis的动态SQL操作--插入
需求:向数据库中插入一条数据 //id,name,sal非空,三个字段都插入 insert into student(id,name,sal) values (?,?,?) //id,name非空,只 ...
- JavaEE的13种核心技术
Java的大方向就是JavaEE,JavaEE不仅仅是socket编程,具体包括13中核心技术. JavaEE平台由一整套服务(Services).应用程序接口(APIs)和协议构成,它对开发基于We ...
- RabbitMQ消息队列(一): Detailed Introduction 详细介绍(转)
1. 历史 RabbitMQ是一个由erlang开发的AMQP(Advanced Message Queue )的开源实现.AMQP 的出现其实也是应了广大人民群众的需求,虽然在同步消息通讯的世界里有 ...
- Java 简单的加密解密算法
package cn.std.util; import java.nio.charset.Charset; public class DeEnCode { private static final S ...
- Magic skills of vim from zhihu
https://www.zhihu.com/question/27478597 插入模式下ctrl-y,重复当前光标上一行的字符 gd 高亮当前词 cc 删除当前行并插入 “.” 这个 mark 代表 ...
- Extension Method[上篇]
在C#3.0中,引入了一些列新的特性,比如: Implicitly typed local variable, Extension method,Lambda expression, Object i ...
- MSSQL复制功能实现与Oracle数据库同步
1.分别建立链接对数据库进行操作,SQLServer可以用ADO.NET,操作Oracle可以用OLEDB或者用System.Data.OracleClient(需要添加引用才能用) 这种方案的优点就 ...
- poj2352Stars
http://poj.org/problem?id=2352 二维逆序数 按一个数排序 转化为1维的 之前用树状数组写过 这次用线段树敲了下 #include <iostream> #in ...
- Flash挡住DIV的解决方法
<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://down ...