BZOJ 2741: 【FOTILE模拟赛】L [分块 可持久化Trie]
题意:
区间内最大连续异或和
5点调试到现在....人生无望
但总算A掉了
一开始想错可持久化trie的作用了...可持久化trie可以求一个数与一个数集(区间中的一个数)的最大异或和
做法比较明显,前缀和后变成选区间内两个元素异或最大
考虑分块,预处理$f[i][j]$第i块到第j块选两个元素异或最大
询问时两边用可持久化trie暴力,中间整块已经预处理了
可以发现预处理复杂度$O(N\sqrt{N}*30)$,必须要枚举块中元素来算,不如直接保存下来$f[i][j]$为第i块到第j个元素的答案
如果说有什么教训的话,就是写之前想清楚每一个变量的意义
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
#define ch(x,y) t[x].ch[y]
typedef long long ll;
const int N=,M=,L=;
inline int read(){
char c=getchar();int x=,f=;
while(c<''||c>''){if(c=='-')f=-; c=getchar();}
while(c>=''&&c<=''){x=x*+c-''; c=getchar();}
return x*f;
} int n,Q,a[N],l,r;
int block,m,pos[N];
struct _Blo{int l,r;}b[M];
void ini(){
block=sqrt(n);
m=(n-)/block+;
for(int i=;i<=n;i++) pos[i]=(i-)/block+;
for(int i=;i<=m;i++) b[i].l=(i-)*block+, b[i].r=i*block;
b[m].r=n;
} struct _Trie{
int ch[],size;
}t[N*L];
int sz,root[N];
void ins(int &x,int now,int v){
t[++sz]=t[x]; x=sz;
t[x].size++;
if(!now) return;
ins( t[x].ch[ bool(now&v) ], now>>, v);
} int tXor(int x,int y,int now,int v){
int ans=;
while(now){
int p= (now&v)==;
if(t[ ch(y,p) ].size - t[ ch(x,p) ].size )
x=ch(x,p), y=ch(y,p), ans+=now;
else p=!p, x=ch(x,p), y=ch(y,p);
now>>=;
}
return ans;
} int f[M][N];
struct Block{
void Set(int x){
int p=b[x].l;
for(int i=p; i<=n; i++)
f[x][i]=max(f[x][i-], tXor(root[p-], root[i-], <<L, a[i]) );
} int Que(int l,int r){
l--;
int pl=pos[l], pr=pos[r];
int ans=;
if(pl==pr){
for(int i=l+;i<=r;i++) ans=max(ans, tXor(root[l-], root[i-], <<L, a[i]) );
}else{
int p;
for(p=l; pos[p]==pos[p-]; p++);
ans=max(ans, f[pos[p]][r]);
for(int i=l;i<p;i++) ans=max(ans, tXor(root[l], root[r], <<L, a[i]) );
}
return ans;
}
}B;
int main(){
freopen("in","r",stdin);
n=read();Q=read(); ini();
for(int i=;i<=n;i++)
a[i]=read()^a[i-], root[i]=root[i-], ins(root[i],<<L,a[i]);
for(int i=;i<=m;i++) B.Set(i); int last=;
while(Q--){
l=(read()+last%n)%n+, r=(read()+last%n)%n+;
if(l>r) swap(l,r);
last=B.Que(l,r);
printf("%d\n",last);
}
}
BZOJ 2741: 【FOTILE模拟赛】L [分块 可持久化Trie]的更多相关文章
- BZOJ.2741.[FOTILE模拟赛]L(分块 可持久化Trie)
题目链接 首先记\(sum\)为前缀异或和,那么区间\(s[l,r]=sum[l-1]^{\wedge}sum[r]\).即一个区间异或和可以转为求两个数的异或和. 那么对\([l,r]\)的询问即求 ...
- bzoj 2741 [FOTILE模拟赛] L
Description 多个询问l,r,求所有子区间异或和中最大是多少 强制在线 Solution 分块+可持久化trie 1.对于每块的左端点L,预处理出L到任意一个i,[L,j] 间所有子区间异或 ...
- 【BZOJ2741】【FOTILE模拟赛】L 分块+可持久化Trie树
[BZOJ2741][FOTILE模拟赛]L Description FOTILE得到了一个长为N的序列A,为了拯救地球,他希望知道某些区间内的最大的连续XOR和. 即对于一个询问,你需要求出max( ...
- 【bzoj2741】[FOTILE模拟赛] L
Portal --> bzoj2741 Solution 突然沉迷分块不能自拔 考虑用分块+可持久化trie来解决这个问题 对于每一块的块头\(L\),预处理\([L,i]\)区间内的所有子区间 ...
- BZOJ2741 FOTILE模拟赛L(分块+可持久化trie)
显然做个前缀和之后变成询问区间内两个数异或最大值. 一种暴力做法是建好可持久化trie后直接枚举其中一个数查询,复杂度O(nmlogv). 观察到数据范围很微妙.考虑瞎分块. 设f[i][j]为第i个 ...
- 【bzoj2741】[FOTILE模拟赛]L 可持久化Trie树+分块
题目描述 FOTILE得到了一个长为N的序列A,为了拯救地球,他希望知道某些区间内的最大的连续XOR和. 即对于一个询问,你需要求出max(Ai xor Ai+1 xor Ai+2 ... xor A ...
- 【BZOJ2741】【块状链表+可持久化trie】FOTILE模拟赛L
Description FOTILE得到了一个长为N的序列A,为了拯救地球,他希望知道某些区间内的最大的连续XOR和. 即对于一个询问,你需要求出max(Ai xor Ai+1 xor Ai+2 .. ...
- BZOJ2741:[FOTILE模拟赛]L
Description FOTILE得到了一个长为N的序列A,为了拯救地球,他希望知道某些区间内的最大的连续XOR和. 即对于一个询问,你需要求出max(Ai xor Ai+1 xor Ai+2 .. ...
- 【BZOJ】【2741】【FOTILE模拟赛】L
可持久化Trie+分块 神题……Orz zyf & lyd 首先我们先将整个序列搞个前缀异或和,那么某一段的异或和,就变成了两个数的异或和,所以我们就将询问[某个区间中最大的区间异或和]改变成 ...
随机推荐
- spring如何控制事务
Spring 的事务,可以说是 Spring AOP 的一种实现. AOP面向切面编程,即在不修改源代码的情况下,对原有功能进行扩展,通过代理类来对具体类进行操作. spring是一个容器,通过spr ...
- 访问Google工具
借助Google访问助手加速 下载地址: http://www.ggfwzs.com/
- HTTP协议----->连接管理
1. TCP连接 1.1 TCP为HTTP提供了一条可靠的比特传输管道. TCP(Transmission Control Protocol)----传输控制协议,是主机对主机层的传输控制协议,提 ...
- python 模块中的 __init__.py __main__.py
python中文件夹想作为一个模块被引用,则在文件夹内必须要包含 __init__.py 文件,即使此文件为空. 如果此模块想要运行则必须要包含 __main__.py 文件.接下来说下两个文件起到的 ...
- thinkphp无法加载控制器:Admin
在使用thinkphp时,通过某入口文件访问其他非默认的模块(比如Admin模块),出现报错: 无法加载控制器:Admin 原因:入口文件(比如index.php)中定义了绑定某个具体的模块 如:de ...
- Tp-link路由器怎么设置端口映射 内网端口映射听语音
https://jingyan.baidu.com/article/ca00d56c710ef9e99eebcf85.html 只有一台能上网的电脑就可以自己免费搭建服务器,本经验简单介绍家用tp-l ...
- Oracle实战笔记(第六天)之PL/SQL基础
一.PL/SQL介绍 1.概念 PL/SQL也是一种程序语言,叫做过程化SQL语言(Procedural Language/SQL).PL/SQL是Oracle数据库对SQL语句的扩展.在普通SQL语 ...
- python arvg用法
转自:http://blog.csdn.net/vivilorne/article/details/3863545 在学python的过程中,一直弄不明白sys.argv[]的意思,虽知道是表示命令行 ...
- cocos2dx 从2.2.6 到3.16 升级流水记录
一个cocos2dx项目从2.2.6 升级至3.16 的过程,由于没有直升工具,类库升级也变动很大,有一部分需要手工完工升级.此记录供参考 1. 没有采用项目直升方式,先新建一个3.16的项目,然后把 ...
- Netty初探
匠心零度 转载请注明原创出处,谢谢! 说在前面 为什么我们需要学习netty?谈谈自己的看法,由于本人水平有限,如果有那里不对,希望各位大佬积极指出,欢迎在留言区进行评论交流.探讨. 由于移动互联网的 ...