//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. (转)Gamma分布,Beta分布,Multinomial多项式分布,Dirichlet狄利克雷分布

    1. Gamma函数 首先我们可以看一下Gamma函数的定义: Gamma的重要性质包括下面几条: 1. 递推公式: 2. 对于正整数n, 有 因此可以说Gamma函数是阶乘的推广. 3.  4.  ...

  2. ORACLE ITL事务槽

    讲到ITL(事务槽)必定先说数据块,那么什么是数据块呢?先给大家上一个数据块结构图 数据块分别由块头.ITL(事务槽).表信息区.行信息区.块空闲区.行数据区组成,其中ITL用来记录在数据块发生的所有 ...

  3. Django项目在Linux服务器上部署和躺过的坑

    引言 在各方的推荐下,领导让我在测试环境部署之前开发的测试数据预报平台.那么问题来了,既然要在服务器上部署, 就需要准备: 1.linux服务器配置 2.linux安装python环境搭建与配置 3. ...

  4. FFMPEG学习----使用SDL播放PCM数据

    参考雷神的代码: /** * 最简单的SDL2播放音频的例子(SDL2播放PCM) * Simplest Audio Play SDL2 (SDL2 play PCM) * * 本程序使用SDL2播放 ...

  5. tomcat的编码设置

    Connector port="8080" protocol="HTTP/1.1" URIEncoding="UTF-8"          ...

  6. Java面向对象XMind

    Java面向对象的思维导图

  7. List<E> 、Set<E>和Map<K,E>的简单应用

    题目一: 创建两个线性表,分别存储{“chen”,“wang”,“liu”,“zhang”}和{“chen”,“hu”,“zhang”},求这两个线性表的交集和并集. 代码: List_Test.ja ...

  8. 【搞定面试官】- Synchronized如何实现同步?锁优化?(1)

    前言 说起Java面试中最高频的知识点非多线程莫属.每每提起多线程都绕不过一个Java关键字--synchronized.我们都知道该关键字可以保证在同一时刻,只有一个线程可以执行某个方法或者某个代码 ...

  9. [Effective Java 读书笔记] 第三章类和接口 第十三 -- 十四条

    第十三条 使类和成员的可访问性最小化 总得来说,我们应该尽量将成员的访问范围限制到最小!有利于解耦,开发.测试和优化都能够更加独立. 对于成员(域,方法,嵌套类和嵌套接口),有四种可能的访问级别,访问 ...

  10. 以stm32f407为例,学习cortex-m4通用寄存器的用法

    测试代码如下: int add(int a, int b, int c, int d, int e, int f) { return a+b+c+d+e+f; } int main(void) { i ...