传送门

解题思路

  首先求出前缀异或和,那么问题就转化成了区间内选两个数使得其异或和最大。数据范围不是很大考虑分块,设\(f[x][i]\)表示第\(x\)块开头到\(i\)这个位置与\(a[i]\)异或得到的最大的数,而对\(f\)求前缀\(max\)就可以得出每一块的开头到后面任意一点的区间内异或最大。而求\(f\)的过程实际是从区间内取一个数和给定数异或和最大,那么这个可以用\(0/1\) \(Trie\)来做,就可以造一棵可持久化\(Trie\)。询问时整块直接调用\(f\),前面的小块直接用可持久化\(Trie\)求解,时间复杂度\(O(n\sqrt(n) logn)\)

代码

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath> using namespace std;
const int N=12005;
const int M=N*60;
typedef long long LL; template<class T> void rd(T &x){
x=0; char ch=getchar();
while(!isdigit(ch)) ch=getchar();
while(isdigit(ch)) x=(x<<1)+(x<<3)+ch-'0',ch=getchar();
}
inline int max(int x,int y) {return x>y?x:y;} int n,m,siz,num,rt[N],tot,bl[N],l[N],r[N];
int a[N],f[205][N],lstans,zz[N]; struct Trie{
int ch[M][2],sum[M];
void insert(int pre,int &x,int now,int d){
x=++tot; sum[x]=sum[pre]+1; if(!d) return ;
ch[x][0]=ch[pre][0]; ch[x][1]=ch[pre][1];
if(now&(1<<(d-1))) insert(ch[pre][1],ch[x][1],now,d-1);
else insert(ch[pre][0],ch[x][0],now,d-1);
}
int query(int u,int v,int now,int d){
if(!d) return 0;
if(now&(1<<(d-1))) {
if(sum[ch[u][0]]-sum[ch[v][0]]!=0)
return (query(ch[u][0],ch[v][0],now,d-1))|(1<<(d-1));
else return query(ch[u][1],ch[v][1],now,d-1);
}
else {
if(sum[ch[u][1]]-sum[ch[v][1]]!=0)
return (query(ch[u][1],ch[v][1],now,d-1)|(1<<(d-1)));
else return query(ch[u][0],ch[v][0],now,d-1);
}
}
}tree; inline void prework(){
for(int i=1;i<=num;++i)
for(int j=l[i]+1;j<=n;++j)
f[i][j]=tree.query(rt[j],rt[l[i]-1],a[j],31);
// for(int i=1;i<=num;i++)
// for(int j=l[i]+1;j<=n;j++)
// printf("f[%d][%d]=%lld\n",i,j,f[i][j]);
for(int i=1;i<=num;++i)
for(int j=l[i]+1;j<=n;++j)
f[i][j]=max(f[i][j],f[i][j-1]);
} inline int ask(int x,int y){
int ret=0;
if(bl[x]==bl[y]){
for(int i=x;i<y;++i)
ret=max(ret,tree.query(rt[y],rt[max(0,x-1)],a[i],31));
return ret;
}
ret=f[bl[x]+1][y];
for(int i=x;i<=r[bl[x]];++i)
ret=max(ret,tree.query(rt[y],rt[max(0,x-1)],a[i],31));
return ret;
} signed main(){
rd(n),rd(m); siz=sqrt(n);
num=n/siz; if(n%siz) num++;
for(int i=1;i<=n;++i){
rd(a[i]); bl[i]=(i-1)/siz+1; a[i]^=a[i-1];
tree.insert(rt[i-1],rt[i],a[i],31);
}
for(int i=1;i<=num;++i) l[i]=(i-1)*siz+1,r[i]=i*siz;
r[num]=n; prework(); int L,R;
while(m--){
rd(L); rd(R);
L=((LL)lstans+L)%n+1,R=((LL)lstans+R)%n+1;
if(L>R) swap(L,R); lstans=ask(L-1,R);
printf("%d\n",lstans);
}
return 0;
}

BZOJ 2741: 【FOTILE模拟赛】L(可持久化Trie+分块)的更多相关文章

  1. BZOJ.2741.[FOTILE模拟赛]L(分块 可持久化Trie)

    题目链接 首先记\(sum\)为前缀异或和,那么区间\(s[l,r]=sum[l-1]^{\wedge}sum[r]\).即一个区间异或和可以转为求两个数的异或和. 那么对\([l,r]\)的询问即求 ...

  2. bzoj 2741 [FOTILE模拟赛] L

    Description 多个询问l,r,求所有子区间异或和中最大是多少 强制在线 Solution 分块+可持久化trie 1.对于每块的左端点L,预处理出L到任意一个i,[L,j] 间所有子区间异或 ...

  3. 【bzoj2741】[FOTILE模拟赛]L 可持久化Trie树+分块

    题目描述 FOTILE得到了一个长为N的序列A,为了拯救地球,他希望知道某些区间内的最大的连续XOR和. 即对于一个询问,你需要求出max(Ai xor Ai+1 xor Ai+2 ... xor A ...

  4. 【BZOJ2741】【块状链表+可持久化trie】FOTILE模拟赛L

    Description FOTILE得到了一个长为N的序列A,为了拯救地球,他希望知道某些区间内的最大的连续XOR和. 即对于一个询问,你需要求出max(Ai xor Ai+1 xor Ai+2 .. ...

  5. BZOJ2741 FOTILE模拟赛L(分块+可持久化trie)

    显然做个前缀和之后变成询问区间内两个数异或最大值. 一种暴力做法是建好可持久化trie后直接枚举其中一个数查询,复杂度O(nmlogv). 观察到数据范围很微妙.考虑瞎分块. 设f[i][j]为第i个 ...

  6. 【bzoj2741】[FOTILE模拟赛] L

    Portal --> bzoj2741 Solution 突然沉迷分块不能自拔 考虑用分块+可持久化trie来解决这个问题 对于每一块的块头\(L\),预处理\([L,i]\)区间内的所有子区间 ...

  7. BZOJ2741:[FOTILE模拟赛]L

    Description FOTILE得到了一个长为N的序列A,为了拯救地球,他希望知道某些区间内的最大的连续XOR和. 即对于一个询问,你需要求出max(Ai xor Ai+1 xor Ai+2 .. ...

  8. bzoj 2741: 【FOTILE模拟赛】L 分塊+可持久化trie

    2741: [FOTILE模拟赛]L Time Limit: 15 Sec  Memory Limit: 162 MBSubmit: 1116  Solved: 292[Submit][Status] ...

  9. 【BZOJ】【2741】【FOTILE模拟赛】L

    可持久化Trie+分块 神题……Orz zyf & lyd 首先我们先将整个序列搞个前缀异或和,那么某一段的异或和,就变成了两个数的异或和,所以我们就将询问[某个区间中最大的区间异或和]改变成 ...

随机推荐

  1. 测开之路七十二:性能测试工具之locust简介

    locust官网:https://locust.io/ locust安装(不支持python3.7):pip install locustio   或者pycharm安装 官网给出的样例 根据官网代码 ...

  2. delphi 之 get post

    http://www.cnblogs.com/ccqin/archive/2012/08/22/2650348.html delphi 之 get post 没测试过这个 var Source: TM ...

  3. Dapper - a simple object mapper for .Net

    Dapper - a simple object mapper for .Net Release Notes Located at stackexchange.github.io/Dapper Pac ...

  4. Vagrant 手册之 Provisioning - file 配置程序

    原文地址 Provisioner 命令:"file" 通过 file 配置程序可以上传宿主机的文件或目录到虚拟机中. 使用场景:将宿主机的 ~/.gitconfig 复制到虚拟机中 ...

  5. 公司C++规范学习

    目录 公司C++规范学习 语法部分 风格/约定 公司C++规范学习 语法部分 class和struct关键字的选择:class表示被封装的用户自定义类型,不公开定义非静态数据成员,struct表示数据 ...

  6. tensorflow学习框架(炼数成金网络版学习记录)

    chapter1 #变量 import tensorflow as tf x = tf.Variable([1,2]) a = tf.constant([3,3]) #增加一个减法op sub = t ...

  7. MySQL-第五篇视图

    1.视图看上去像是表,但它又不是,它并不能存储数据.视图只是一个或者多个表的逻辑显示.使用视图的好处: 1>可以限制对数据的访问 2>可以使复杂的查询变得简单 3>提供了数据的独立性 ...

  8. Kubernetes V1.16.2部署Dashboard V2.0(beta5)

    Kubernetes V1.16.2部署Dashboard V2.0(beta5) 在Master上部署Dashboard 集群安装部署请看安装Kubernetes V1.16.2 kubectl g ...

  9. cocos2d-x 3.0正式版创建project笔记

    cocos2d-x 3.0正式版创建project笔记     不知道Beta版那个高大上的对话框哪里去鸟,正式版又回归到命令行,不知道触碰如此频繁的玩弄追随者的编程习惯是出于什么心理,假设不是为了这 ...

  10. Jenkins windows 执行批量cmd命令XCOPY 提示'XCOPY' 不是内部或外部命令,也不是可运行的程序 或批处理文件。

    由于Jenkins没有配置环境变量造成 打开Jenkins=>Manage Jenkins =>Configure System =>全局属性 新增全局变量 健: Path 值: % ...