http://www.lydsy.com/JudgeOnline/problem.php?id=2741

思路:我们先将a变成a的异或前缀,这样问题就变成了,在l-1到r区间内,找出i,j令a[i]^a[j]最大。

假如i是固定的,我们可以建一个可持久化trie,在l-1到r区间内贪心寻找最优,但是这题i和j都不是固定的,如果暴力枚举i,那时间复杂度最坏是m*n*logn。

因此我们考虑这样:将n个数字分块,预处理出数组f[i][j],代表从第i块的开头作为左端点固定,j为右端点,这里面能产生的最优异或和,可以得到f[i][j]=max(f[i][j-1],query(root[start[i]-1],root[j],a[j])),这样转移,就能在接近O(n)的时间复杂度内预处理出数组,这样,对于m个询问中的每个l,r,假如l属于块i,那么我们先让ans=f[i+1][r],这样剩下我们只需要暴力解决l所属块i内的答案,这个求法就是上面说的固定点i,在root[l-1],root[r]区间内贪心查找,更新答案即可,还有这题,在强制在线的时候lastans+x和lastans+y可能会爆int。

 #include<algorithm>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<iostream>
#define ll long long
int n,m,a[],b[],ch[][],sz,block_num,block_size,size[];
int f[][],root[];
int read(){
char ch=getchar();int t=,f=;
while (ch<''||ch>''){if (ch=='-') f=-;ch=getchar();}
while (''<=ch&&ch<=''){t=t*+ch-'';ch=getchar();}
return t*f;
}
void insert(int &k,int kk,int v,int dep){
k=++sz;
size[k]=size[kk]+;
if (dep==-) return;
ch[k][]=ch[kk][],ch[k][]=ch[kk][];
if (v&(<<dep)) insert(ch[k][],ch[kk][],v,dep-);
else insert(ch[k][],ch[kk][],v,dep-);
}
int query(int x,int y,int v){
int res=;
for (int i=;i>=;i--){
int t=((v&(<<i))>);
if (size[ch[y][t^]]-size[ch[x][t^]]>){
res|=(<<i);
y=ch[y][t^];
x=ch[x][t^];
}else{
y=ch[y][t];
x=ch[x][t];
}
}
return res;
}
int main(){
scanf("%d%d",&n,&m);
block_size=(int)sqrt(n);
block_num=n/block_size+(n%block_size!=);
for (int i=;i<=n;i++) {scanf("%d",&a[i]);a[i]^=a[i-];}
int ans=;
for (int i=;i<=n;i++) insert(root[i],root[i-],a[i],);
for (int i=;i<=block_num;i++)
for (int j=(i-)*block_size+;j<=n;j++){
f[i][j]=std::max(f[i][j-],query(root[(i-)*block_size],root[j],a[j]));
if (i==) f[i][j]=std::max(f[i][j],a[j]);
}
while (m--){
int x,y;
scanf("%d%d",&x,&y);
x%=n;y%=n;
x=(x+(ans%n))%n+;
y=(y+(ans%n))%n+;
if (x>y) std::swap(x,y);
x--;
int num=x/block_size+(x%block_size!=);
ans=;
int l=num*block_size+;
if (l<=y) ans=f[num+][y];
l=std::min(l,y);
for (int j=x;j<l;j++)
ans=std::max(ans,query(root[x],root[y],a[j]));
printf("%d\n",ans);
}
}

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 首先我们先将整个序列搞个前缀异或和,那么某一段的异或和,就变成了两个数的异或和,所以我们就将询问[某个区间中最大的区间异或和]改变成 ...

  10. 【BZOJ2741】【FOTILE模拟赛】L 分块+可持久化Trie树

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

随机推荐

  1. C#.NET利用ContextBoundObject和Attribute实现AOP技术--AOP事务实现例子

    我前两天看见同事用写了用AOP技术实现缓存的方案,于是好奇看了一下这是怎么实现的.原来是用了.NET中的一个类ContextBoundObject和Attribute相关技术.其实个类在.NET Fr ...

  2. Spring Boot 启动加载数据 CommandLineRunner

    实际应用中,我们会有在项目服务启动的时候就去加载一些数据或做一些事情这样的需求. 为了解决这样的问题,Spring Boot 为我们提供了一个方法,通过实现接口 CommandLineRunner 来 ...

  3. 【转】vim文件编码和乱码处理

    原文网址:http://edyfox.codecarver.org/html/vim_fileencodings_detection.html 在 Vim 中,有四个与编码有关的选项,它们是:file ...

  4. Java反编译插件jad

    原文地址:http://www.cnblogs.com/JimLy-BUG/p/5405868.html 1.首先下载jar文件:net.sf.jadclipse_3.3.0.jar  下载   2. ...

  5. IOS开发错误提示原因集合-----长期更新

    "[__NSCFConstantString size]: unrecognized selector sent to instance." =>将NSString类型的参数 ...

  6. linux下面测试网络带宽 (转载)

    利用bmon/nload/iftop/vnstat/iptraf实时查看网络带宽状况 一.添加yum源方便安装bmon# rpm -Uhv http://apt.sw.be/redhat/el5/en ...

  7. freemarker报错之三

    1.错误描写叙述 Expression students is undefined on line 30, column 24 in student.ftl. The problematic inst ...

  8. 数据分析系统DIY3/3:本地64位WIN7+matlab 2012b訪问VMware CentOS7+MariaDB

    数据分析系统DIY中要完毕的三个任务. 一.用VMware装64位CentOS.数据库服务端用CentOS自带的就好. 二.数据採集与预处理用Dev-C++编程解决. 三.用本地Win7 64上的MA ...

  9. js转换ascii编码如中文友转换为编码友;可防止乱码

  10. EffectiveC#11--选择foreach循环

    1.C#的foreach语句可以为你的任何集合产生最好的迭代代码 不推荐如下写法(?原因未明白 作者意思是阻碍jit边界检测) int len = foo.Length; for ( int inde ...