bzoj 3261最大异或和
Description
Input
第一行包含两个整数 N ,M,含义如问题描述所示。
第二行包含 N个非负整数,表示初始的序列 A 。
接下来 M行,每行描述一个操作,格式如题面所述。
Output
假设询问操作有 T个,则输出应该有 T行,每行一个整数表示询问的答案。
题意:应该很清楚了;
题解:
①原题中的式子比较假: 化成max( (a[n] xor x)xor a[p-1] ) p∈[l,r];
②前面的now = (a[n] xor x)是一个定值,建立一颗字典树,从高位到低位考虑,一定是尽量选和now的那一位相反的数,对前缀建树,如果类似于普通01字典树,只是把一个数字插入经过的所有节点++,这个可持久的结构维护sum[r]-sum[l-1]第i位的节点值位0或1的个数;
③查询时,从高到低枚举位数j,如果和now的j位相反的数个数在sum[r]-sum[l-1]内存在,则进入这个节点,否则进入另一个节点执行同样操作,每次更新选择的数的j位;
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
const int N=,S = ;
int n,m,a[N],b[N],x,rt[N],sz,ch[N*S][],sum[N*S];
char gc(){
static char *p1,*p2,s[];
if(p1==p2) p2=(p1=s)+fread(s,,,stdin);
return(p1==p2)?EOF:*p1++;
}
int rd(){
int x = ; char c = gc();
while(c<''||c>'') c = gc();
while(c>=''&&c<='') x = x * + c - '',c = gc();
return x;
}
bool opt(){
char c = gc();
while(c!='A'&&c!='Q') c = gc();
return c=='A';
}
int ins(int last,int val){
int k,ret; k = ret = ++sz;
for(int i = ;i >= ;i--){
sum[k] = sum[last] + ; ch[k][] = ch[last][]; ch[k][] = ch[last][];
int d = (val>>i)&;
k = ch[k][d] = ++sz; last = ch[last][d];
}
sum[k] = sum[last] + ;
return ret;
}
int query(int k1,int k2,int val){
int ret = ;
for(int i = ;i >= ;i--){
int d = (val>>i)&;
if(sum[ch[k2][d^]]-sum[ch[k1][d^]]>)
ret|=(<<i),k1=ch[k1][d^],k2=ch[k2][d^];
else k1=ch[k1][d],k2=ch[k2][d];
}
return ret;
}
int main()
{ freopen("bzoj3261.in","r",stdin);
freopen("bzoj3261.out","w",stdout);
n = rd()+; m = rd();
rt[]=ins(rt[],b[]);
for(int i = ;i <= n;i++) b[i] = b[i-]^rd(),rt[i]=ins(rt[i-],b[i]);
char s[];
for(int i = ;i <= m;i++){
if(opt()){
n++; b[n]=b[n-]^rd();
rt[n]=ins(rt[n-],b[n]);
}
else {
int l = rd(),r = rd(),x = rd();
int tmp = query(rt[l-],rt[r],b[n]^x);
printf("%d\n",tmp);
}
}
return ;
}//by tkys_Austin;
bzoj 3261最大异或和的更多相关文章
- BZOJ 3261: 最大异或和( 可持久化trie )
搞成前缀和然后就可以很方便地用可持久化trie维护了.时间复杂度O((N+M)*25) -------------------------------------------------------- ...
- 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 ...
- BZOJ 3261: 最大异或和
Description 一个序列,支持两个操作. 1.在序列尾加入一个数. 2.询问 [l,r] 中与 x 异或值最大的数. \(n\leqslant 3*10^5\) Sol 可持久化 Trie 树 ...
- BZOJ 3261 最大异或和(算竞进阶习题)
可持久化Trie 需要知道一个异或的特点,和前缀和差不多 a[p] xor a[p+1] xor....xor a[n] xor x = a[p-1] xor a[n] xor x 所以我们把a[1. ...
- bzoj 3261 最大异或和 可持久化字典树(01树)
题目传送门 思路: 由异或的性质可得,题目要求的式子可以转化成求$max(pre[n]^x^pre[i])$,$pre[i]$表示前缀异或和,那么我们现在就要求出这个东西,所以用可持久化字典树来求,每 ...
- bzoj 3261 最大异或和【可持久化trie】
因为在后面加数字又求后缀和太麻烦,所以xor[p...n]=xor[1...n]^xor[p-1...n]. 首先处理出来区间异或前缀和,对前缀和建trie树(在最前面放一棵0表示最开始的前缀和 然后 ...
- BZOJ 3261 最大异或和 (可持久化01Trie)
题目大意:让你维护一个序列,支持在序列末插入一个数,支持询问$[l,r]$区间内选择一个位置$p$,使$xor\sum_{i=p}^{n}a_{i}$最大 可持久化$01Trie$裸题,把 区间异或和 ...
- 可持久化+Trie || BZOJ 3261最大异或和 || Luogu P4735 最大异或和
题面:最大异或和 代码: #include<cstdio> #include<cstring> #include<iostream> using namespace ...
随机推荐
- 2017-2018-1 1623 bug终结者 冲刺003
bug终结者 冲刺003 by 王旌含 今日任务:优化界面布局,提供图片素材 需求 app图标.主界面图.主界面中按钮图:选择关卡图.关卡按键图:游戏中的小人.箱子.地板.墙.目的地:方向按钮:重置按 ...
- js的 == 和 ===的区别
1.对于string,number等基础类型,==和===是有区别的 不同类型间比较,==之比较转化成同一类型后的值看值是否相等,===如果类型不同,其结果就是不等,同类型比较,直接进行"值 ...
- bzoj千题计划288:bzoj1876: [SDOI2009]SuperGCD
http://www.lydsy.com/JudgeOnline/problem.php?id=1876 高精压位GCD 对于 GCD(a, b) a>b 若 a 为奇数,b 为偶数,GCD ...
- 【原创】Webpack构建中hash的优化
背景: SPA的vue应用,采用webpack2构建,打包入口为main.js 输出:main模块打包成app.js,公共lib打包成vendor.js,公共样式打包成app.css,运行时依赖打包成 ...
- Python扩展模块——调用WindowsAPI(pywin32的简单使用)
这块使用的比较少,只用到了模拟键盘按键, 调用鼠标比较费事,是通过像素坐标实现的,如果没有特殊需求或万不得已不建议使用 import win32con import win32api win32api ...
- 微信小程序如何动态增删class类名
简述 由于微信小程序开发不同于以往的普通web开发, 因此无法通过js获取wxml文件的dom结构, 因此从js上直接添加一个类名应该不可能了. 可是我们可以通过微信小程序数据绑定以及view标签的& ...
- Python内置函数(33)——any
英文文档: any(iterable) Return True if any element of the iterable is true. If the iterable is empty, re ...
- Step by Step 真正从零开始,TensorFlow详细安装入门图文教程!帮你完成那个最难的从0到1
摘要: Step by Step 真正从零开始,TensorFlow详细安装入门图文教程!帮你完成那个最难的从0到1 安装遇到问题请文末留言. 悦动智能公众号:aibbtcom AI这个概念好像突然就 ...
- 版本名称GA的含义:SNAPSHOT->alpha->beta->release->GA
SNAPSHOT->alpha->beta->release->GA ----------------------------------------------------- ...
- Tomcat(1-1)重置Tomcat8.5管理员的用户名和密码
1.访问 http://localhost:8080/,点击 [manager app],提示输入用户名和密码,admin/admin后报错. 2.解决办法:重置Tomcat8.5管理员的用户名和密 ...