bzoj 3261 最大异或和 可持久化字典树(01树)
思路:
由异或的性质可得,题目要求的式子可以转化成求$max(pre[n]^x^pre[i])$,$pre[i]$表示前缀异或和,那么我们现在就要求出这个东西,所以用可持久化字典树来求,每次贪心的往相反的方向看是否有值,具体看代码即可,模板题,注意最好先插入一个0,查询区间的$(l,r)$也要注意一下端点,记住我们要的是前缀。
#include<bits/stdc++.h>
#define clr(a,b) memset(a,b,sizeof(a))
typedef long long ll;
using namespace std;
const int maxn=;
int sum[maxn*],tr[maxn*][],cnt,root[maxn];
int pre,n,m,l,r,d[];
void split(int x)
{
int len=;
while(x>){
d[len++]=x%;
x/=;
}
while(len<)d[len++]=;
}
inline void update(int &rt,int las){
sum[rt=++cnt]=sum[las]+;
int tmp=rt;
for(int i=;i>=;i--){
tr[tmp][d[i]^]=tr[las][d[i]^];
tr[tmp][d[i]]=++cnt,las=tr[las][d[i]];
sum[tmp=cnt]=sum[las]+;
}
}
int query(int l,int r){
int ans=;
for(int i=;i>=;i--)
{
if(sum[tr[r][d[i]^]]-sum[tr[l][d[i]^]]>){
ans|=(<<i);
r=tr[r][d[i]^],l=tr[l][d[i]^];
}else{
r=tr[r][d[i]],l=tr[l][d[i]];
}
}
return ans;
}
int main(){
while(cin>>n>>m)
{
pre=;
split();
update(root[],root[]);
n++;
for(int i=;i<=n;i++)
{
int x;
scanf("%d",&x);
pre^=x;
split(pre);
update(root[i],root[i-]);
}
char op[];
for(int i=;i<=m;i++)
{
scanf("%s",op);
if(op[]=='A'){
n++;
int x;
scanf("%d",&x);
pre^=x;
split(pre);
update(root[n],root[n-]);
}else{
int l,r,x;
scanf("%d%d%d",&l,&r,&x);
split(pre^x);
printf("%d\n",query(root[l-],root[r]));
}
}
} }
bzoj 3261 最大异或和 可持久化字典树(01树)的更多相关文章
- BZOJ 3261: 最大异或和( 可持久化trie )
搞成前缀和然后就可以很方便地用可持久化trie维护了.时间复杂度O((N+M)*25) -------------------------------------------------------- ...
- BZOJ 3261 最大异或和 (可持久化01Trie)
题目大意:让你维护一个序列,支持在序列末插入一个数,支持询问$[l,r]$区间内选择一个位置$p$,使$xor\sum_{i=p}^{n}a_{i}$最大 可持久化$01Trie$裸题,把 区间异或和 ...
- BZOJ 3261 最大异或和 可持久化Trie树
题目大意:给定一个序列,提供下列操作: 1.在数组结尾插入一个数 2.给定l,r,x,求一个l<=p<=r,使x^a[p]^a[p+1]^...^a[n]最大 首先我们能够维护前缀和 然后 ...
- bzoj 3261: 最大异或和 (可持久化trie树)
3261: 最大异或和 Time Limit: 10 Sec Memory Limit: 512 MB Description 给定一个非负整数序列 {a},初始长度为 N. ...
- BZOJ 3261: 最大异或和位置-贪心+可持久化01Trie树
3261: 最大异或和 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 3519 Solved: 1493[Submit][Status][Discu ...
- 51Nod XOR key —— 区间最大异或值 可持久化字典树
题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1295 1295 XOR key 题目来源: HackerRa ...
- bzoj 3261 最大异或和【可持久化trie】
因为在后面加数字又求后缀和太麻烦,所以xor[p...n]=xor[1...n]^xor[p-1...n]. 首先处理出来区间异或前缀和,对前缀和建trie树(在最前面放一棵0表示最开始的前缀和 然后 ...
- 可持久化+Trie || BZOJ 3261最大异或和 || Luogu P4735 最大异或和
题面:最大异或和 代码: #include<cstdio> #include<cstring> #include<iostream> using namespace ...
- BZOJ 3261: 最大异或和
Description 一个序列,支持两个操作. 1.在序列尾加入一个数. 2.询问 [l,r] 中与 x 异或值最大的数. \(n\leqslant 3*10^5\) Sol 可持久化 Trie 树 ...
随机推荐
- 清北学堂 day6 兔子
---恢复内容开始--- [问题描述] 在一片草原上有N个兔子窝,每个窝里住着一只兔子,有M条路径连接这些窝.更特殊地是,至多只有一个兔子窝有3条或更多的路径与它相连,其它的兔子窝只有1条或2条路径与 ...
- vim全局替换命令-乾颐堂
语法为 :[addr]s/源字符串/目的字符串/[option] 全局替换命令为::%s/源字符串/目的字符串/g [addr] 表示检索范围,省略时表示当前行. 如:“1,20” :表示从第1行到2 ...
- [SoapUI] 按照 Test Step Type 获取所有满足条件的 Test Step
获取当前测试用例下所有Groovy Script类型的测试步骤 def testStepList = testRunner.testCase.getTestStepsOfType(com.eviwar ...
- Smarty简介
Smarty是一个使用PHP写出来的模板引擎,是目前业界最著名的PHP模板引擎之一.它分离了逻辑代码和外在的内容,提供了一种易于管理和使用的方法,用来将原本与HTML代码混杂在一起PHP代码逻辑分离. ...
- javascript总结36:DOM-点击按钮切换图片案例
<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8& ...
- http 介绍
https://www.cnblogs.com/ranyonsue/p/5984001.html 关于HTTP协议,一篇就够了 HTTP简介 HTTP协议是Hyper Text Transfer Pr ...
- 深入理解java虚拟机(十二) Java 语法糖背后的真相
语法糖(Syntactic Sugar),也叫糖衣语法,是英国计算机科学家彼得·约翰·兰达(Peter J. Landin)发明的一个术语.指的是,在计算机语言中添加某种语法,这些语法糖虽然不会对语言 ...
- [安裝] Ubuntu Server 初试
在 Delphi 10.2 Tokyo 版里将支持 Linux 系统,先做一下学习记录: 安装 Ubuntu Server: 安装方法请参考官方教学影片: https://community.emba ...
- SharpMap入门教程
SharpMap是一个基于.NET Framework 4,采用C#开发的地图渲染引擎,非常易于使用.本教程针对SharpMap入门及开发,讲述如何基于SharpMap组件渲染Shapefile数据. ...
- Arcgis Android 手动搭建开发环境
前言 本文为大家分享arcgis android 环境的手动搭建过程,默认你懂一定的java和android 基础知识,已经有android的开发环境.如缺乏以上环境和知识,请自行补充. 版本介绍 A ...