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 首先我们先将整个序列搞个前缀异或和,那么某一段的异或和,就变成了两个数的异或和,所以我们就将询问[某个区间中最大的区间异或和]改变成 ...
随机推荐
- 用gcc编译c语言程序以及其编译过程
对于初学c语言编程的我们来说,学会如何使用gcc编译器工具,对理解c语言的执行过程,加深对c语言的理解很重要!!! 1.预编译 --> 2.编译 --> 3.汇编 --> 4.链接- ...
- c++(快速排序)
快速排序是编程中经常使用到的一种排序方法.可是很多朋友对快速排序有畏难情绪,认为快速排序使用到了递归,是一种非常复杂的程序,其实未必如此.只要我们使用好了方法,就可以自己实现快速排序. 首先,我们复习 ...
- eclipse中常用提高效率的快捷键
Eclipse快捷键 10个最有用的快捷键 5 4 Eclipse中10个最有用的快捷键组合 一个Eclipse骨灰级开发者总结了他认为最有用但又不太为人所知的快捷键组合.通过这些组合可以更加容易的 ...
- 自己编写JavaScript的sort函数
在平常开发中我们经常会遇到对数组进行排序的场景,js给我们提供了sort方法可以对数组元素进行排序,默认是按ASCII字母表顺序排序,请看下面例子: var a = [1, 3, 2, 4];var ...
- JavaScript八张思维导图—操作符
JS基本概念 JS操作符 JS基本语句 JS数组用法 Date用法 JS字符串用法 JS编程风格 JS编程实践 不知不觉做前端已经五年多了,无论是从最初的jQuery还是现在火热的Angular,Vu ...
- Oracle_SQL99_连接查询
Oracle_SQL99_连接查询 交叉连接 cross join --交叉连接 cross join --作用:产生两个表的笛卡尔积 select * from emp cross join d ...
- Solr学习笔记2(V7.2)---导入自己的数据
学而不思则罔,思而不学则殆,总是看文档不动手效果是不好的.没有实地的从自己的数据库获取数据测试一下始终是空,总结一下自己的操作步骤吧. 第一步准备配置文件 E:\Solr\server\solr\co ...
- 利用 HTML5 WebGL 构建的 3D 拓扑图
现在,3D 模型已经用于各种不同的领域.在医疗行业使用它们制作器官的精确模型:电影行业将它们用于活动的人物.物体以及现实电影:视频游戏产业将它们作为计算机与视频游戏中的资源:在科学领域将它们作为化合物 ...
- Oracle内连接、外连接、右外连接、全外连接小总结
数据库版本:Oracle 9i 表TESTA,TESTB,TESTC,各有A, B两列 A B 001 10A 002 20A A B 001 10B 003 30B A B 001 10C 004 ...
- Python 使用Pillow模块生成验证码
1.安装 pip3 install pillow 2.使用步骤 生成验证码和验证字符串 绘制图片,将验证码放入session中 将图片返回给页面 3.代码demo #!/usr/bin/env pyt ...