Description

FOTILE得到了一个长为N的序列A,为了拯救地球,他希望知道某些区间内的最大的连续XOR和。

即对于一个询问,你需要求出max(Ai xor Ai+1 xor Ai+2 ... xor Aj),其中l<=i<=j<=r。

为了体现在线操作,对于一个询问(x,y):

l = min ( ((x+lastans) mod N)+1 , ((y+lastans) mod N)+1 ).

r = max ( ((x+lastans) mod N)+1 , ((y+lastans) mod N)+1 ).

其中lastans是上次询问的答案,一开始为0。

Solution

前缀异或和一下,然后就是求两个数的异或和最大,可以 \(trie\) 树上贪心

考虑分块做

块内可以预处理出 \(f[i][j]\) 表示块内的 \(i\),到 \(j\) 之间任选两个的异或和的最大值

然后回答询问就直接用块内信息,块外多出来的长度 \(<=\sqrt{n}\) 暴力求一遍就可以了

#include<bits/stdc++.h>
using namespace std;
template<class T>void gi(T &x){
int f;char c;
for(f=1,c=getchar();c<'0'||c>'9';c=getchar())if(c=='-')f=-1;
for(x=0;c<='9'&&c>='0';c=getchar())x=x*10+(c&15);x*=f;
}
typedef long long ll;
const int N=12010;
int n,m,b[N],B,s[N],cnt,rt[N],tt=0;ll f[205][N],a[N],bin[N];
struct data{
int ls,rs,s;
}tr[N*100];
inline void ins(int &x,int d,ll w){
tr[++tt]=tr[x];x=tt;tr[x].s++;
if(d==-1)return ;
if(w&bin[d])ins(tr[x].rs,d-1,w);
else ins(tr[x].ls,d-1,w);
}
inline ll qry(int l,int r,int d,ll w){
if(d==-1)return 0;
if(w&bin[d]){
if(tr[tr[r].ls].s-tr[tr[l].ls].s)
return bin[d]+qry(tr[l].ls,tr[r].ls,d-1,w);
return qry(tr[l].rs,tr[r].rs,d-1,w);
}
else{
if(tr[tr[r].rs].s-tr[tr[l].rs].s)
return bin[d]+qry(tr[l].rs,tr[r].rs,d-1,w);
return qry(tr[l].ls,tr[r].ls,d-1,w);
}
}
int main(){
freopen("pp.in","r",stdin);
freopen("pp.out","w",stdout);
cin>>n>>m;B=sqrt(n);cnt=n/B;
for(int i=1;i<=n;i++)gi(a[i]),a[i]^=a[i-1];
for(int i=0,t;i<=n;i++)b[i]=(t=i/B),s[t]=s[t]?s[t]:i;
bin[0]=1;for(int i=1;i<=60;i++)bin[i]=bin[i-1]<<1;
ins(rt[0],60,0);
for(int i=1;i<=n;i++)rt[i]=rt[i-1],ins(rt[i],60,a[i]);
for(int i=0;i<=cnt;i++){
f[i][s[i]]=0;
for(int j=s[i]+1;j<=n;j++)
f[i][j]=max(f[i][j-1],qry(rt[s[i]-1],rt[j-1],60,a[j]));
}
ll x,y,ans=0;
while(m--){
gi(x);gi(y);x=(x+ans)%n+1;y=(y+ans)%n+1;
if(x>y)swap(x,y);x--;ans=0;
if(y-x+1<=B){
for(int i=x;i<y;i++)ans=max(ans,qry(rt[i],rt[y],60,a[i]));
printf("%lld\n",ans);
continue;
}
int t=s[b[x]]<x?b[x]+1:b[x];
for(int i=t;i<=cnt && s[b[i]]<=y;i++)ans=max(ans,f[i][y]);
for(int i=x;i<=s[t];i++)
ans=max(ans,qry(rt[i],rt[y],60,a[i]));
printf("%lld\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. bzoj 2741 [FOTILE模拟赛] L

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

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

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

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

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

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

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

  6. BZOJ2741:[FOTILE模拟赛]L

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

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

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

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

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

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

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

  10. BZOJ2741: 【FOTILE模拟赛】L

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

随机推荐

  1. 在Delphi中获取和修改文件的时间

    转载自 http://www.cnblogs.com/jieke/archive/2013/01/11/2855782.html 本文介绍了在Delphi中利用系统函数和Windows API函数调用 ...

  2. underscore里面的debounce与throttle

    throttle 策略的电梯.保证如果电梯第一个人进来后,15秒后准时运送一次,不等待.如果没有人,则待机. debounce 策略的电梯.如果电梯里有人进来,等待15秒.如果又人进来,15秒等待重新 ...

  3. hdu 6196 搜索+剪枝

    Today, Bob plays with a child. There is a row of n numbers. One can takes a number from the left sid ...

  4. zTree学习笔记

    一.zTree的下载 官网:http://www.treejs.cn/v3/main.php#_zTreeInfo 解压后的目录结构为: 二.zTree入门案例 2.1 在页面中引入相关文件 要使用z ...

  5. rest-assured的日志使用介绍

    在许多测试用例当中,为了帮助我们创建正确的断言和发送正确的请求,打印出详细的响应和请求数据是非常有用的.为此我们可以使用rest-assured提供的预定义过滤器或者使用其中的一些快捷方法. 一.请求 ...

  6. SQL Server2012如何更改服务器的名称

    Problem: sql server 2012 安装完毕后,连接数据库只能使用 机器名\数据库实例 的方式,想用 localhost 或 . 作为服务器名称不可以 Solution: 参考:http ...

  7. Kibana6.x.x源码分析--JavaScript中 "!~" 这样的符号是啥意思?

    看到源码中有一段JS代码不太懂,如下: 里面这个 "!~" 符号看到后有点儿方啊O__O "…,毛线意思? [查资料,解释如下]: indexOf returns -1 ...

  8. SPOJ - FREQ2 莫队 / n^1.5logn爆炸

    题意:给定\(a[1...n]\)和\(Q\)次询问,每次统计\([L,R]\)范围内出现频率最高的数的次数 想法没啥好说的,分别统计该数出现的次数和次数出现的次数,然后莫队暴力 注意本题时间卡的很紧 ...

  9. lambda 表达式定制操作

    泛型算法中的定制操作 许多算法都会比较输入序列中的元素以达到排序的效果,通过定制比较操作,可以控制算法按照编程者的意图工作. 普通排序算法: template<class RandomItera ...

  10. PHP中Session ID的实现原理

    前序: 首先要明白PHPSESSID看似多次刷新都不会改变其实是没有删除本地相关联的cookie,删除的方法 session_destroy();//删除服务器端的session文件 setcooki ...