Description



n,q<=20000
a[i]<=10^9

Solution


今天场外体验noi刺激战场,发现我只会做T1这种送分题(⊙ˍ⊙),还没切。果然人菜还是要多读书

首先做前缀和,变成两个点的问题
与异或相关可以考虑trie。一个暴力的做法就是建可持久化trie然后枚举查询最大异或和
看到n很小一个想法就是对区间分块,预处理f[i,j]表示块i的起点到j这一段的答案,然后搞搞就可以了

如果没有强制在线可以莫队,然鹅直接莫队就有90分

Solution


#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <math.h>
#define rep(i,st,ed) for (int i=st;i<=ed;++i)
#define drp(i,st,ed) for (int i=st;i>=ed;--i)typedef long long LL;
const int N=20005;
const int B=185;int rec[N*60][2],root[N],sum[N*60],tot;
int st[B],ed[B],bel[N],a[N];
int wjp[B][N],ans;int read() {int x=0,v=1; char ch=getchar();for (;ch<'0'||ch>'9';v=(ch=='-')?(-1):(v),ch=getchar());for (;ch<='9'&&ch>='0';x=x*10+ch-'0',ch=getchar());return x*v;
}int ins(int x,int v) {int y=++tot; int ret=y;drp(i,29,0) {rec[y][0]=rec[x][0];rec[y][1]=rec[x][1];sum[y]=sum[x]+1;int now=(v&(1<<i))!=0;x=rec[x][now];y=rec[y][now]=++tot;}sum[y]=sum[x]+1;return ret;
}int query(int pre,int x,int v) {int ret=0;drp(i,29,0) {int now=(v&(1<<i))!=0;if (sum[rec[x][!now]]-sum[rec[pre][!now]]>0) {x=rec[x][!now];pre=rec[pre][!now];ret+=1<<i;} else {x=rec[x][now];pre=rec[pre][now];}// if (ret+(1<<i+1)-1<=ans) return ret;}return ret;
}int main(void) {freopen("data.in","r",stdin);freopen("myp.out","w",stdout);int n=read(),q=read(),t=read();int m=sqrt(n);root[0]=ins(0,0);rep(i,1,n) {a[i]=a[i-1]^read();root[i]=ins(root[i-1],a[i]);bel[i]=(i-1)/m+1;if (!st[bel[i]]) st[bel[i]]=i;ed[bel[i]]=std:: max(ed[bel[i]],i);}rep(i,1,m) {rep(j,st[i],n) {wjp[i][j]=std:: max(wjp[i][j-1],query((st[i]-1)?root[st[i]-2]:0,root[j],a[j]));}}for (int lastans=0,cnt=0;q--;cnt++) {int l=read(),r=read(); ans=0;int x=(l+t*(LL)lastans)%n+1;int y=(r+t*(LL)lastans)%n+1;if (x>y) std:: swap(x,y);int px=bel[x],py=bel[y];if (py==px) {rep(j,x,y) ans=std:: max(ans,query((x-1)?(root[x-2]):0,root[y],a[j]));} else {ans=wjp[px+1][y];rep(j,x-1,ed[px]) ans=std:: max(ans,query((x-1)?(root[x-2]):0,root[y],a[j]));rep(j,st[py],y) ans=std:: max(ans,query((x-1)?(root[x-2]):0,root[y],a[j]));}printf("%d\n", ans); lastans=ans;}return 0;
}

jzoj5382 [GDOI2018模拟9.21]数列 可持久化trie+分块相关推荐

  1. BZOJ2741 【FOTILE模拟赛】L 【可持久化trie + 分块】

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

  2. jzoj5920. 【NOIP2018模拟10.21】风筝(dp,最长上升子序列)

    5920. [NOIP2018模拟10.21]风筝 Description 当一阵风吹来,风筝飞上天空,为了你,而祈祷,而祝福,而感动-- Description oyiya 在 AK 了 IOI 之 ...

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

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

  4. [您有新的未分配科技点]可,可,可持久化!?------0-1Trie和可持久化Trie普及版讲解...

    这一次,我们来了解普通Trie树的变种:0-1Trie以及在其基础上产生的可持久化Trie(其实,普通的Trie也可以可持久化,只是不太常见) 先简单介绍一下0-1Trie:一个0-1Trie节点只有 ...

  5. 【BZOJ 4103】 4103: [Thu Summer Camp 2015]异或运算 (可持久化Trie)

    4103: [Thu Summer Camp 2015]异或运算 Time Limit: 20 Sec  Memory Limit: 512 MB Submit: 474  Solved: 258 D ...

  6. Nikitosh 和异或 —— 一道 trie 树的题用可持久化 trie 水 然后翻车了...

    题意简介 题目就是叫你找两个不重合的非空区间,使得这两个区间里的数异或后相加的和最大 (看到异或,没错就决定是你了可持久化trie!) 思路 水一波字典树,莫名觉得这题可持久化能过,于是水了一发挂了, ...

  7. bzoj 3261 最大异或和【可持久化trie】

    因为在后面加数字又求后缀和太麻烦,所以xor[p...n]=xor[1...n]^xor[p-1...n]. 首先处理出来区间异或前缀和,对前缀和建trie树(在最前面放一棵0表示最开始的前缀和 然后 ...

  8. Bzoj3261/洛谷P4735 最大异或和(可持久化Trie)

    题面 Bzoj 洛谷 题解 显然,如果让你查询整个数列的最大异或和,建一颗\(01Trie\),每给定一个\(p\),按照二进制后反方向跳就行了(比如当前二进制位为\(1\),则往\(0\)跳,反之亦 ...

  9. BZOJ3166 [Heoi2013]Alo 【可持久化trie树 + 二分 + ST表】

    题目 Welcome to ALO ( Arithmetic and Logistic Online).这是一个VR MMORPG , 如名字所见,到处充满了数学的谜题. 现在你拥有n颗宝石,每颗宝石 ...

最新文章

  1. Android在Java获取组件,在Java中解析HTML以获取Android应用
  2. Linux GCC用法
  3. 【网络安全】一些webshell免杀的技巧
  4. c语言中void msg,如何连接到IRC服务器/解析C语言(提供代码)的IRC MSG/PING-PONG处理...
  5. sklearn自学指南(part52)--潜在狄利克雷分配(LDA)
  6. linux查看某进程cpu使用情况,linux中如何查看进程对应的cpu使用情况?
  7. CCF NOI1047 寻找鞍点
  8. python数据接口设计_基于python的接口测试框架设计(一)连接数据库
  9. python用户输出怎么命名变量_python变量及用户交互,用户名格式化输出
  10. python windows api截图_Winapi快速截图并打开
  11. 基于Pytorch版yolov5的滑块验证码破解思路
  12. python eof是什么_EOF是什么?
  13. java怎么弹出页面_java怎么样实现弹出窗口
  14. 如果一个n位正整数等于它的n个数字的n次方和,则称该数为n位自方幂数。编程计算并输出所有的n的所有情况。
  15. Vivado 添加IOB方法
  16. Java五子棋(局域网)
  17. 如何用Scrum做变革管理的落地实施
  18. Java实现 蓝桥杯VIP 算法提高 班级排名
  19. sql触发器Tigger
  20. 20181212股票复盘

热门文章

  1. 写在前面(一些感想及纪念今天正式开始写博客)
  2. Redis 是单线程的正确理解
  3. linux常用60条命令 转
  4. 搜索引擎排名实战经验
  5. Java实现 LeetCode 516 最长回文子序列
  6. css3动画 会动的背景图片
  7. 对象创建等2019/2/26
  8. 要不要充值WPS会员?
  9. “创新实践”项目介绍7:《看护服务机械狗》
  10. 仿制斯坦福机械狗——动起来!