Description

多个询问l,r,求所有子区间异或和中最大是多少

强制在线

Solution

分块+可持久化trie

1.对于每块的左端点L,预处理出L到任意一个i,[L,j] 间所有子区间异或和中最大为多少,\(\Theta(n\sqrt n)\)

2.对于询问x,y:

①x,y属于同一块,O(\(\sqrt n log n\))直接扫

②x,y不属于同一块, 找到x右边第一块的左端点,用预处理求出左端点到y,剩下的直接扫,O(\(\sqrt n log n\))

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <cctype>
using namespace std;
typedef long long LL;
const int M=12930;
const int B=30;
const int L=111;
inline int rd(){
int x=0;bool f=1;char c=getchar();
for(;!isdigit(c);c=getchar())if(c=='-')f=0;
for(;isdigit(c);c=getchar())x=x*10+c-48;
return x;
} int n,m,sn;
int a[M];
int s[L][M];
int tot;
int ch[M*32][2];
int sz[M*32];
int root[M]; int F(int x){//写法取决于存法
return x/sn;
} int cpynode(int rt){
tot++;
ch[tot][0]=ch[rt][0];
ch[tot][1]=ch[rt][1];
sz[tot]=sz[rt]+1;
return tot;
} int ins(int rt,int d){
int tmp,x,y,i,k;
tmp=x=cpynode(rt);
for(i=B;i>=0;i--){
k=(d>>i)&1;
y=cpynode(ch[x][k]);
ch[x][k]=y;
x=y;
}
return tmp;
} int get(int lt,int rt,int d){
int i,k,res=0;
for(i=B;i>=0;i--){
k=((d>>i)&1)^1;
if(sz[ch[rt][k]]-sz[ch[lt][k]]>0)
lt=ch[lt][k],rt=ch[rt][k],res+=(1<<i);
else lt=ch[lt][k^1],rt=ch[rt][k^1];
}
return res;
} int main(){
int i,j;
int x,y,z,st,ll,rr;
n=rd(),m=rd();
sn=(int)sqrt(n);
for(i=1;i<=n;i++) a[i]=a[i-1]^rd();
root[0]=ins(root[0],0);
for(i=1;i<=n;i++) root[i]=ins(root[i-1],a[i]);
for(i=0;i<=n;i++) if(i%sn==0){//
x=F(i);
s[x][i]=0;
for(j=i+1;j<=n;j++){
s[x][j]=max(s[x][j-1],get(root[(i-1)>=0?(i-1):(n+1)],root[j-1],a[j]));
}
}
int ans=0;
for(i=1;i<=m;i++){
ans%=n;
ll=rd()%n,rr=rd()%n;
x=min((ll+ans)%n+1,(rr+ans)%n+1);
y=max((ll+ans)%n+1,(rr+ans)%n+1);
x--;
ans=0;
if(F(x)==F(y)){
//ans=a[y];这样写是错的
for(j=x;j<y;j++) ans=max(ans,get(root[j],root[y],a[j]));
}
else{
if(x%sn==0) z=F(x);//
else z=F(x)+1;
st=z*sn;//取决于存法
ans=s[z][y];
for(j=x;j<st;j++) ans=max(ans,get(root[j],root[y],a[j]));
}
printf("%d\n",ans);
}
return 0;
}

bzoj 2741 [FOTILE模拟赛] L的更多相关文章

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

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

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

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

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

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

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

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

  5. BZOJ2741:[FOTILE模拟赛]L

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

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

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

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

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

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

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

  9. BZOJ2741: 【FOTILE模拟赛】L

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

随机推荐

  1. 解决MySQL安装到最后一步未响应的三种方法

    这种情况一般是你以前安装过MySQL数据库服务项被占用了.解决方法: 方法一:安装MySQL的时候在这一步时它默认的服务名是“MySQL” 只需要把这个名字改了就可以了.可以把默认的服务器的名称手动改 ...

  2. python的对数

    python的对数 首先要导入 math 模块: import math import numpy as np math.log(8,2),此为以2为底8的对数 等于 math.log2(8); 等于 ...

  3. SVG path

    在网页上画一图形,比如星星或波浪线,开始是想着图形软件画一个的,后来发现SVG这绘图程序的语言,感觉甚是可以,就发了些时间学了一下,在此做一简单分享和记录. 菜鸟上是这么介绍的(SVG 是使用 XML ...

  4. 背景透明度处理 兼容IE

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  5. nuxt.js express模板项目虚拟目录部署问题汇总

    声明环境 反向代理:nginx或者iis的ARR 模板项目:nuxt-express 部署环境:windows 经过了一段时间在windows环境部署项目来看,关于虚拟目录的问题汇总如下, 发布场景假 ...

  6. DC84问

    1.1 什么是DC?DC(Design Compiler)是Synopsys公司的logical synthesis工具,它根据design description和design constraint ...

  7. 绘制弧形:imagearc() 说明:三点钟的位置是起点(0度

    <?php //1. 绘制图像资源(创建一个画布) $image = imagecreatetruecolor(500, 300); //2. 先分配一个绿色 $green = imagecol ...

  8. psutil模块的基础使用

    注:Python并没有自带psutil模块,需要自己去安装 安装psutil模块 pip install psutilorpip3 install psutil 一.导入模块 import psuti ...

  9. Codeforces Round #461 (Div. 2) C. Cave Painting

    C. Cave Painting time limit per test 1 second memory limit per test 256 megabytes Problem Descriptio ...

  10. Git-Git初始化

    创建版本库及第一次提交 通过如下操作来查看一下您的Git版本. $ git --version git version 1.7.4 在开始 Git 之旅之前,我们需要设置一下 Git 的配置变量,这是 ...