P4735-最大异或和【可持久化Trie】
正题
题目链接:https://www.luogu.com.cn/problem/P4735
题目大意
nnn个数字,有操作
- 在末尾加入一个数字xxx
- 询问[l,r][l,r][l,r]范围内的一个ppp使得ap⊕ap+1⊕ap+2...⊕an⊕xa_p\oplus a_{p+1}\oplus a_{p+2}...\oplus a_{n}\oplus xap⊕ap+1⊕ap+2...⊕an⊕x的值最大。
解题思路
定义sis_isi表示前缀异或和,那么其实答案就是求一个在[l−1,r−1][l-1,r-1][l−1,r−1]中的一个sps_psp使得sn⊕x⊕sps_n\oplus x\oplus s_psn⊕x⊕sp最大。
后面两个是固定的,考虑如何求sps_psp,我们知道我们可以用TrieTrieTrie求静态的异或和最大,就是按照反方向路径行走。所以这里我们用类似于主席树的方法建立一颗可持久化TrieTrieTrie。
不同的是,我们对于每个节点要维护一个最大的上限lastlastlast(也就是这个节点的子树中包含的最后的插入的节点),这样询问时我们从rtrrt_rrtr出发,避开last<llast<llast<l的节点就好了。
时间复杂度O(28n)O(28n)O(28n)
codecodecode
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=5e5+10,W=28;
int n,m,cnt,a[N],rt[N];
int ch[N*40][2],last[N*40];
int Insert(int x,int k,int val,int id){int y=++cnt;if(k<0){last[y]=id;return y;}int c=(val>>k)&1;ch[y][c^1]=ch[x][c^1];ch[y][c]=Insert(ch[x][c],k-1,val,id);last[y]=max(last[ch[y][0]],last[ch[y][1]]);return y;
}
int Ask(int x,int k,int val,int lim){if(k<0)return last[x];int c=((val>>k)&1)^1;if(last[ch[x][c]]>=lim)return Ask(ch[x][c],k-1,val,lim);return Ask(ch[x][c^1],k-1,val,lim);
}
int main()
{scanf("%d%d",&n,&m);memset(last,-1,sizeof(last));rt[0]=Insert(0,W,0,0);for(int i=1;i<=n;i++){scanf("%d",&a[i]);a[i]^=a[i-1];rt[i]=Insert(rt[i-1],W,a[i],i);}while(m--){char op[4];int l,r,x;scanf("%s",op);if(op[0]=='Q'){scanf("%d%d%d",&l,&r,&x);l--;r--;int ans=Ask(rt[r],W,a[n]^x,l);printf("%d\n",a[n]^x^a[ans]);}else{scanf("%d",&a[++n]);a[n]^=a[n-1];rt[n]=Insert(rt[n-1],W,a[n],n);}}return 0;
}
P4735-最大异或和【可持久化Trie】相关推荐
- P4735 最大异或和 可持久化trie树
可持久化01trie类似主席树思想 但是不支持版本差(也可以加一个siz 做差) 只能再维护一个左端点的最大值即可 #include<bits/stdc++.h> using ...
- 【bzoj3261】最大异或和 可持久化Trie树
题目描述 给定一个非负整数序列 {a},初始长度为 N. 有M个操作,有以下两种操作类型: 1.A x:添加操作,表示在序列末尾添加一个数 x,序列的长度 N+1. 2.Q l r x: ...
- BZOJ3261: 最大异或和(可持久化trie树)
题意 题目链接 Sol 设\(sum[i]\)表示\(1 - i\)的异或和 首先把每个询问的\(x \oplus sum[n]\)就变成了询问前缀最大值 可持久化Trie树维护前缀xor,建树的时候 ...
- BZOJ 3261: 最大异或和 [可持久化Trie]
3261: 最大异或和 Time Limit: 10 Sec Memory Limit: 512 MB Submit: 1513 Solved: 657 [Submit][Status][Disc ...
- BZOJ.3261.最大异或和(可持久化Trie)
题目链接 这个每次修改后缀好像很难搞,但是因为异或可以抵消,求sum[p~n]的最大值可以转化为求sum[1~n] xor sum[1~p-1]的最大值. \(p-1\in [l-1,r-1]\),用 ...
- BZOJ 3261 最大异或和 可持久化Trie树
题目大意:给定一个序列,提供下列操作: 1.在数组结尾插入一个数 2.给定l,r,x,求一个l<=p<=r,使x^a[p]^a[p+1]^...^a[n]最大 首先我们能够维护前缀和 然后 ...
- P4592 [TJOI2018]异或 (可持久化Trie)
[题目链接] https://www.luogu.org/problemnew/show/P4592 题目描述 现在有一颗以\(1\)为根节点的由\(n\)个节点组成的树,树上每个节点上都有一个权值\ ...
- P4735 最大异或和(可持久化trie树、求最大区间异或和)
P4735 最大异或和 我们维护一个前缀异或和:s[i]=a[1]xora[2]xor-a[i−1]xora[i]s[i] = a[1] \ xor\ a[2]\ xor\ - a[i-1] \ xo ...
- Bzoj3261/洛谷P4735 最大异或和(可持久化Trie)
题面 Bzoj 洛谷 题解 显然,如果让你查询整个数列的最大异或和,建一颗\(01Trie\),每给定一个\(p\),按照二进制后反方向跳就行了(比如当前二进制位为\(1\),则往\(0\)跳,反之亦 ...
- P4735 贪心 + 可持久化 Trie
题意 传送门 P4735 最大异或和 题解 设 s[i+1]s[i+1]s[i+1] 为 a[0],a[1],⋯,a[i]a[0],a[1],\cdots,a[i]a[0],a[1],⋯,a[i] 的 ...
最新文章
- @RenderBody、@RenderSection、@RenderPage、Html.RenderPartial、Html.RenderAction的作用和区别...
- Struts2---入门
- 操作RadGrid1,RadAjaxLoadingPanel1不出现
- AGC026E - Synchronized Subsequence
- 中国工业企业数据库(1998-2014年)
- shell编程规范与变量
- 小马激活工具对比暴风激活工具
- 115网盘如何打开php文件格式,opensuse安装115网盘客户端
- android连接php还是asp,ASP或PHP如何判断是从电脑还是手机客户端访问页面的思路...
- 逆向工具Cutter
- ieTEST停止工作bug修复
- 惠普CEO李艾科的“金刚钻儿”
- Springboot 下载文件
- 生产力飙升!皮卡智能新产品上线,带你进入AIGC新纪元
- Up in the Air-3
- 宝塔面板 linux工具箱,宝塔面板教程大全–宝塔linux面板专业版数据同步插件使用教程...
- 英雄联盟手游显示服务器尚未开启什么意思,英雄联盟手游could not connect to the server是什么意思-could not解决办法[图文]-游戏窝...
- 全国公交接口 公交线路查询
- CCI指标在市场经济体制改革中,力挽狂澜的CCI指标
- ffmpeg录制系统声音
热门文章
- mock java_JAVA的mock工具mockito简介
- oracle 12c 多线程,Oracle 12c(12.1)中性能优化功能增强之通过参数THREADED_EXECTION使用多线程模型...
- python如何封装成可调用的库_Python实现打包成库供别的模块调用
- 解决浏览器存储问题,不得不了解的cookie,localStorage和sessionStorage
- java while do循环_c语言中,while 和 do while 循环的主要区别是( )
- [RabbitMQ]RabbitMQ概念_四大核心概念
- [Swagger2]SpringBoot集成Swagger
- 异步清零和同步置数/清零的区别
- 高等数学上-赵立军-北京大学出版社-题解-练习4.5
- 计算机操作系统第四章作业