//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. docker相关----解决tomcat容器启动成功,无法访问的问题

    使用docker安装了tomcat镜像,默认为latest最新的(8.5.50版本),依据tomcat镜像创建容器并同时做了端口映射 命令为:docker run --name tomcat01 -d ...

  2. 解决keil5不支持Samsung 2440A等较旧型号Soc的方法

    手上有一块mini2440,最近想拿来跑一下程序.于是去下了最新版的Keil5,结果发现创建工程时没有Samsung一系列型号的CPU选项.   没有办法,去网上找了很久,才发现原因是新版的Keil5 ...

  3. linux实用指令 | 程序员线上排查必知必会linux指令(持续更新中)

    Linux线上排查程序员实用指南 一.乱码问题 二.帮助指令 1. help命令 2. man命令 3. info命令 三.性能监测与优化 1. top命令 参考资源 Linux线上排查程序员实用指南 ...

  4. Maven: 把聚合工程下的项目导入 Ecplise

    1.右键点击import 2.Import Existing Maven Projects 3.选择要导入的工程 4.完成

  5. 表达式属性(C#6.0和C#7.0

    从C#6开始,只读属性可简写为表达式属性.它使用双箭头替换了花括号,get访问器和return关键字. 例如: decimal CurrentPrice,sharedOwned; public dec ...

  6. ps-如何移动照片里的内容

    1.我们用内容感知移动工具把所要移动的区域大致勾选出来. 2.然后我们将所选区域拖动(点击鼠标左键不放拖动). 3.松开鼠标 4.仿制图章工具,alt 键取样,涂抹

  7. Cheat Sheet pyspark RDD(PySpark 速查表)

  8. [软件分享]Office Tool Plus,一个OFFICE 管理、下载、安装器

    转载自我的博客:https://blog.ljyngup.com 教程摘自官方教程. 出事与本人无关 官网:https://otp.landian.vip/zh-cn/ Office Tool Plu ...

  9. POP and IMAP - Post Office Protocol and Internet Message Access Protocol

    POP and IMAP - Post Office Protocol and Internet Message Access Protocol 用来从 SMTP Server 上下载邮件的协议. P ...

  10. 踩坑ThinkPHP5之模型对象返回的数据集如何转为数组

    各位小伙伴们大家好,冷月今天在做项目的过程中呢,遇到了一个坑就是用tp5的模型操作数据库时,返回的是数据集而不是直接的数组.于是冷月就想办法如何将数据集转为数组.写下这篇博文,防止大家遇到这个坑时可以 ...