//tire的可持久化
//线段树的可持久化——主席树
//可持久化的前提:本身的拓扑结构在操作时不变
//可以存下来数据结构的所有历史版本
//核心思想:只记录每一个版本与前一个版本不一样的地方
// //s[i]=a[1]^a[2]^a[3]^...^a[n]
//a[p]^a[p+1]^...a[N]^x=s[p-1]^s[N]^x //对于s[N]^x
//从最高位开始考虑
//如果是1,那么就优先考虑是0的,如果有是0的,那么就把所有当前位为1的舍去,如果没有,再去考虑1的
//如果是0,那么就优先考虑是1的,如果有是1的,那么就把所有当前位位0的社区,如果没有,再去考虑0的 //假设左子树是当前位位0的
//询问左子树是否存在一个数的下标>=l
//等价于左子树下标最大值是否>=l
//所以可以记录一个max_id,表示当前子树中,下标最大值
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int N = , M = N * ;
int n, m;
int s[N];
//01串,所以开2 记录最大的id
int tr[M][], max_id[M];
//记录根节点
int root[N], idx;
//i:当前第几位,前缀和s的下标
//k:当前处理到第几位
//p:上一个版本
//q:最新版本
void insert(int i, int k, int p, int q)
{
//说明处理完最后一位
if (k < )
{
//存的是叶节点,叶节点的max_id就是本身
max_id[q] = i;
return;
}
//当前这一位
int v = s[i] >> k & ;
//如果p存在,就表示之前已经插入的数字中,存在数字这一位存在1
if (p)
//要把其他的信息复制过来,当前儿子不用复制过来,其他的要复制过来
tr[q][v ^ ] = tr[p][v ^ ];
//当前这一位开新的点 ,
tr[q][v] = ++ idx;
//进行下一位
insert(i, k - , tr[p][v], tr[q][v]);
//更新最大id
max_id[q] = max(max_id[tr[q][]], max_id[tr[q][]]);
}
// 根 当前值 左边界限制
int query(int root, int C, int L)
{
//从根节点开始
int p = root;
//每一位
for (int i = ; i >= ; i -- )
{
int v = C >> i & ;
//判断对立面是否存在
if (max_id[tr[p][v ^ ]] >= L)
p = tr[p][v ^ ];
else
p = tr[p][v];
}
return C ^ s[max_id[p]];
}
int main()
{
scanf("%d%d", &n, &m);
//根节点 带前缀和之后坐标从0开始
//初始化为-1
max_id[] = -;
//插入x[0]的这个版本
root[] = ++ idx;
// 从第23位开始,最一开始上个版本没有,所以为0
// 当前版本为root[0]
insert(, , , root[]);
for (int i = ; i <= n; i ++ )
{
int x;
scanf("%d", &x);
//前缀和
s[i] = s[i - ] ^ x;
//赋根节点
root[i] = ++ idx;
//当前是第i位,从23位开始,前一个根节点,当前根节点
insert(i, , root[i - ], root[i]);
}
char op[];
int l, r, x;
//操作
while (m -- )
{
scanf("%s", op);
//插入
if (*op == 'A')
{
scanf("%d", &x);
n ++ ;
//前缀和
s[n] = s[n - ] ^ x;
//新版本根节点
root[n] = ++ idx;
//插入
insert(n, , root[n - ], root[n]);
}
else
{
scanf("%d%d%d", &l, &r, &x);
//要找p-1
//所以区间是l-1到r-1
//限制是l-1
printf("%d\n", query(root[r - ], s[n] ^ x, l - ));
}
}
return ;
}

P4735 最大异或和 /【模板】可持久化Trie的更多相关文章

  1. Bzoj3261/洛谷P4735 最大异或和(可持久化Trie)

    题面 Bzoj 洛谷 题解 显然,如果让你查询整个数列的最大异或和,建一颗\(01Trie\),每给定一个\(p\),按照二进制后反方向跳就行了(比如当前二进制位为\(1\),则往\(0\)跳,反之亦 ...

  2. BZOJ_3689_异或之_可持久化Trie+堆

    BZOJ_3689_异或之_可持久化Trie+堆 Description 给定n个非负整数A[1], A[2], ……, A[n]. 对于每对(i, j)满足1 <= i < j < ...

  3. BZOJ_3261_最大异或和_可持久化trie

    BZOJ_3261_最大异或和_可持久化trie Description 给定一个非负整数序列{a},初始长度为N. 有M个操作,有以下两种操作类型: 1.Ax:添加操作,表示在序列末尾添加一个数x, ...

  4. 【洛谷 P4735】 最大异或和 (可持久化Trie)

    题目链接 维护整个数列的异或前缀和和\(s\),然后每次就是要求\(s[N]\text{^}x\text{^}s[k],l-1<=k<=r-1\)的最大值 如果没有\(l\)的限制,那么直 ...

  5. [BZOJ 4103] [Thu Summer Camp 2015] 异或运算 【可持久化Trie】

    题目链接:BZOJ - 4103 题目分析 THUSC滚粗之后一直没有写这道题,从来没写过可持久化Trie,发现其实和可持久化线段树都是一样的.嗯,有些东西就是明白得太晚. 首先Orz ZYF-ZYF ...

  6. bzoj 3261: 最大异或和 (可持久化trie树)

    3261: 最大异或和 Time Limit: 10 Sec  Memory Limit: 512 MB Description       给定一个非负整数序列 {a},初始长度为 N.       ...

  7. 【BZOJ 4103】 4103: [Thu Summer Camp 2015]异或运算 (可持久化Trie)

    4103: [Thu Summer Camp 2015]异或运算 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 474  Solved: 258 De ...

  8. BZOJ4103 [Thu Summer Camp 2015]异或运算 【可持久化trie树】

    题目链接 BZOJ4103 题解 一眼看过去是二维结构,实则未然需要树套树之类的数据结构 区域异或和,就一定是可持久化\(trie\)树 观察数据,\(m\)非常大,而\(n\)和\(p\)比较小,甚 ...

  9. 【洛谷5283】[十二省联考2019] 异或粽子(可持久化Trie树+堆)

    点此看题面 大致题意: 求前\(k\)大的区间异或和之和. 可持久化\(Trie\)树 之前做过一些可持久化\(Trie\)树题,结果说到底还是主席树. 终于,碰到一道真·可持久化\(Trie\)树的 ...

  10. 【bzoj3261】【最大异或和】可持久化trie树+贪心

    [pixiv] https://www.pixiv.net/member_illust.php?mode=medium&illust_id=61705397 Description 给定一个非 ...

随机推荐

  1. pku1113-Wall 凸包(安德鲁算法版)

    Wall 题目链接. Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 42823 Accepted: 14602 Descript ...

  2. 自动化运维之Ansible入门

    Ansible简介 Ansible是什么? Ansible 简单的说是一个配置管理系统(ConfiGuration Management System).你只需要可以使用ssh访问你的服务器或设备.它 ...

  3. Docker扩展内容之容器环境变量

    介绍 docker容器设置环境变量除了可以在容器层面的变量文件中加载也可以在容器运行之初进行预加载环境变量,下面介绍在Dockerfile中编写环境变量的方式 ENV TZ=Asia/Shanghai ...

  4. mybatis 源码分析中的知识点

    1. resultMap 和 resultType  之间的优劣 resultMap: 在联合查询的时候, 可以不用写Join (因为在resultMap 的定义里面已经写了这些东西了<asso ...

  5. 项目架构级别规约框架Archunit调研

    背景 最近在做一个新项目的时候引入了一个架构方面的需求,就是需要检查项目的编码规范.模块分类规范.类依赖规范等,刚好接触到,正好做个调研. 很多时候,我们会制定项目的规范,例如: 硬性规定项目包结构中 ...

  6. 死磕mysql(5)

    高性能mysql --查看隐藏的库//use mysql --创建新用户//create user 'new'@'localhost' identified by ''; --创建用户 '用户名'@' ...

  7. HDU 6599 I Love Palindrome String (回文树+hash)

    题意 找如下子串的个数: (l,r)是回文串,并且(l,(l+r)/2)也是回文串 思路 本来写了个回文树+dfs+hash,由于用了map所以T了 后来发现既然该子串和该子串的前半部分都是回文串,所 ...

  8. Go语言实现:【剑指offer】二叉搜索树的第k个的结点

    该题目来源于牛客网<剑指offer>专题. 给定一棵二叉搜索树,请找出其中的第k小的结点.例如,(5,3,7,2,4,6,8) 中,按结点数值大小顺序第三小结点的值为4. Go语言实现: ...

  9. Java框架之SpringSecurity-权限系统

    SpringSecurity SpringSecurity融合Spring技术栈,提供JavaEE应用的整体安全解决方案:提供全面的安全服务.Spring Security支持广泛的认证模型 模块划分 ...

  10. 编译生成protobuf的jar包

    编译生成protobuf的jar包 配置maven 安装maven,并修改maven源为阿里云 下载maven wget http://mirror.bit.edu.cn/apache/maven/m ...