P4735 最大异或和 /【模板】可持久化Trie
//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的更多相关文章
- Bzoj3261/洛谷P4735 最大异或和(可持久化Trie)
题面 Bzoj 洛谷 题解 显然,如果让你查询整个数列的最大异或和,建一颗\(01Trie\),每给定一个\(p\),按照二进制后反方向跳就行了(比如当前二进制位为\(1\),则往\(0\)跳,反之亦 ...
- BZOJ_3689_异或之_可持久化Trie+堆
BZOJ_3689_异或之_可持久化Trie+堆 Description 给定n个非负整数A[1], A[2], ……, A[n]. 对于每对(i, j)满足1 <= i < j < ...
- BZOJ_3261_最大异或和_可持久化trie
BZOJ_3261_最大异或和_可持久化trie Description 给定一个非负整数序列{a},初始长度为N. 有M个操作,有以下两种操作类型: 1.Ax:添加操作,表示在序列末尾添加一个数x, ...
- 【洛谷 P4735】 最大异或和 (可持久化Trie)
题目链接 维护整个数列的异或前缀和和\(s\),然后每次就是要求\(s[N]\text{^}x\text{^}s[k],l-1<=k<=r-1\)的最大值 如果没有\(l\)的限制,那么直 ...
- [BZOJ 4103] [Thu Summer Camp 2015] 异或运算 【可持久化Trie】
题目链接:BZOJ - 4103 题目分析 THUSC滚粗之后一直没有写这道题,从来没写过可持久化Trie,发现其实和可持久化线段树都是一样的.嗯,有些东西就是明白得太晚. 首先Orz ZYF-ZYF ...
- bzoj 3261: 最大异或和 (可持久化trie树)
3261: 最大异或和 Time Limit: 10 Sec Memory Limit: 512 MB Description 给定一个非负整数序列 {a},初始长度为 N. ...
- 【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 ...
- BZOJ4103 [Thu Summer Camp 2015]异或运算 【可持久化trie树】
题目链接 BZOJ4103 题解 一眼看过去是二维结构,实则未然需要树套树之类的数据结构 区域异或和,就一定是可持久化\(trie\)树 观察数据,\(m\)非常大,而\(n\)和\(p\)比较小,甚 ...
- 【洛谷5283】[十二省联考2019] 异或粽子(可持久化Trie树+堆)
点此看题面 大致题意: 求前\(k\)大的区间异或和之和. 可持久化\(Trie\)树 之前做过一些可持久化\(Trie\)树题,结果说到底还是主席树. 终于,碰到一道真·可持久化\(Trie\)树的 ...
- 【bzoj3261】【最大异或和】可持久化trie树+贪心
[pixiv] https://www.pixiv.net/member_illust.php?mode=medium&illust_id=61705397 Description 给定一个非 ...
随机推荐
- Web自动化测试项目(五)测试结果通知
一.邮件通知 使用第三方邮件发送库yagmail github地址:https://github.com/kootenpv/yagmail 安装 pip3 install yagmail demo.p ...
- kali linux下的部分命令
查看发行版本 cat /etc/issue cat /etc/*-release 查看内核版本 uname -a 显示机器的处理器架构 arch uname -m 清屏 clear 命令行 ...
- Git详解之基础使用
前言 读完本章你就能上手使用 Git 了.本章将介绍几个最基本的,也是最常用的 Git 命令,以后绝大多数时间里用到的也就是这几个命令.读完本章,你就能初始化一个新的代码仓库,做一些适当配置:开始或停 ...
- Shell常用命令之yum
介绍 yum命令是在Fedora和RedHat以及SUSE中基于rpm的软件包管理器,它可以使系统管理人员交互和自动化地更细与管理RPM软件包,能够从指定的服务器自动下载RPM包并且安装,可以自动处理 ...
- ElasticSearch入门篇Ⅰ --- ES核心知识概括
C01.什么是Elasticsearch 1.什么是搜索 垂直搜索(站内搜索) 互联网的搜索:电商网站,招聘网站,各种app IT系统的搜索:OA软件,办公自动化软件,会议管理,员工管理,后台管理系 ...
- 透过现象看webpack处理css文件中图片路径转换的具体过程
webpack是目前使用比较流行的一个前端模块打包器,前端的任何资源都被当成一个模块来处理,如图片.css文件等等.在基于webpack构建的前端项目中,一般都会配置有关css文件处理的规则,这其中也 ...
- CAD制图系列之如何画内切圆
今天我将记录我们如何画一个大圆,里面均匀内切四个小圆 具体步骤如下: 第一步:首先,先画一个十字架,用于作为轴 第二步:以十字架交点为圆心,画一个半径为25的圆 第三步:以中点为坐标画四十五度斜线,方 ...
- Java数据结构系列(1)——自平衡二叉树
1.基本概念 所谓自平衡二叉树,就是当我们插入或删除元素之后,二叉树的高度会自动调整到最小,这样我们就可以在对数时间内查找二叉树内的元素. 2.定义 TreeSet<Elemtype> s ...
- Go语言标准库之net/http
Go语言内置的net/http包十分的优秀,提供了HTTP客户端和服务端的实现. net/http介绍 Go语言内置的net/http包提供了HTTP客户端和服务端的实现. HTTP协议 超文本传输协 ...
- Codeforces_813
A.统计总时间,从总时间开始找第一个能提交的点. #include<bits/stdc++.h> using namespace std; ],ok[] = {}; int main() ...