bzoj 2741 [FOTILE模拟赛] L
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的更多相关文章
- BZOJ.2741.[FOTILE模拟赛]L(分块 可持久化Trie)
题目链接 首先记\(sum\)为前缀异或和,那么区间\(s[l,r]=sum[l-1]^{\wedge}sum[r]\).即一个区间异或和可以转为求两个数的异或和. 那么对\([l,r]\)的询问即求 ...
- 【BZOJ2741】【块状链表+可持久化trie】FOTILE模拟赛L
Description FOTILE得到了一个长为N的序列A,为了拯救地球,他希望知道某些区间内的最大的连续XOR和. 即对于一个询问,你需要求出max(Ai xor Ai+1 xor Ai+2 .. ...
- 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:[FOTILE模拟赛]L
Description FOTILE得到了一个长为N的序列A,为了拯救地球,他希望知道某些区间内的最大的连续XOR和. 即对于一个询问,你需要求出max(Ai xor Ai+1 xor Ai+2 .. ...
- 【bzoj2741】[FOTILE模拟赛] L
Portal --> bzoj2741 Solution 突然沉迷分块不能自拔 考虑用分块+可持久化trie来解决这个问题 对于每一块的块头\(L\),预处理\([L,i]\)区间内的所有子区间 ...
- 【BZOJ】【2741】【FOTILE模拟赛】L
可持久化Trie+分块 神题……Orz zyf & lyd 首先我们先将整个序列搞个前缀异或和,那么某一段的异或和,就变成了两个数的异或和,所以我们就将询问[某个区间中最大的区间异或和]改变成 ...
- bzoj 2741: 【FOTILE模拟赛】L 分塊+可持久化trie
2741: [FOTILE模拟赛]L Time Limit: 15 Sec Memory Limit: 162 MBSubmit: 1116 Solved: 292[Submit][Status] ...
- BZOJ2741: 【FOTILE模拟赛】L
2741: [FOTILE模拟赛]L Time Limit: 15 Sec Memory Limit: 162 MBSubmit: 1170 Solved: 303[Submit][Status] ...
随机推荐
- Linux下 tomcat 的开机自启动设置
每次开机都要启动tomcat,非常麻烦:通过直接修改系统文件,实现tomcat自启动: 1. 修改脚本文件rc.local:vim /etc/rc.d/rc.local 这个脚本是使用者自定的开机启动 ...
- Mysql--子查询、分页查询、联合查询
一. 子查询的定义 出现在其他语句中的select语句,称为子查询或者内查询,外部的查询语句称为主查询或者外查询,子查询可以包含普通select可以包含的任何语句. 外部查询:select.inser ...
- JavaScript事件对象与事件的委托
事件对象 包含事件相关的信息,如鼠标.时间.触发的DOM对象等 js默认将事件对象封装好,并自动的以参数的形式,传递给事件处理函数的第1个参数,如下: document.getElementsByTa ...
- spring boot 设置tomcat post参数限制
今天传图片,用的base64字符串,POST方法,前端传送的时候总是莫名其妙的崩溃,去网上搜了半天,以为是文件大小被限制了,但是我这个是字符串接收,不是文件接收,于是又继续搜,原来post本身没有参数 ...
- django开发傻瓜教程-1-安装和HelloWorld
安装 sudo pip install Django 新建项目 django-admin startproject XXX 启动项目 进入主目录下 python manage.py runserver ...
- Memory loss【记忆缺失】
Memory Loss Losing your ability to think and remember is pretty scary. We know the risk of dementia ...
- [USACO]玉米实验(单调队列)
Description 约翰决定培育新的玉米品种以提高奶牛的产奶效率.约翰所有的土地被分成 N ×N 块,其中第 r行第 c 列的玉米质量为 Ar,c.他打算找一块质量比较均匀的土地开始自己的实验.经 ...
- python数据排序
1.原地排序 data.sort() #对原列表进行排序 2.复制排序 data2 = sorted(data) #原列表不变,作为参数传给sorted()方法进行排序
- #2 create and populate a database && realistic and practical applications (PART 2)
Extends from the last chapter , This chapter takes a look at some real-world problems that can occur ...
- 【Python】函数参数类型及用法
一.函数的参数类型 def hs(a1,a2,a3,...): ****statements 其中a1,a2,a3是函数的参数,函数的参数类型可分为:必须参数.默认参数.可变参数(不定长参数).关键 ...