题目

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。

输入格式

第一行两个整数N和M。
第二行有N个正整数,其中第i个数为Ai,有多余空格。
后M行每行两个数x,y表示一对询问。

输出格式

共M行,第i行一个正整数表示第i个询问的结果。

输入样例

3 3

1 4 3

0 1

0 1

4 3

输出样例

5

7

7

提示

HINT

N=12000,M=6000,x,y,Ai在signed longint范围内。

题解

区间异或和最大,转化为两个前缀和

多次询问不同区间,用可持久化trie树

但每次要任意选出两个数,而常规的trie树只支持一个数询问区间和它的最大异或值,不能处理区间内任意两个数异或和最大值
何破?

我们不可能每次询问\(O(n^2logn)\)枚举其中一个数
那就预处理!
如果我们能预处理出每个区间异或最大值,就是\(O(n^2logn)\)预处理,\(O(1)\)查询

能不能均摊一下?
分块!
我们只预处理每个块头到其后面所有位置的数异或的最大值
具体的,设\(f[i][j]\)表示\(i\)块开头位置到\(j\)中所有数异或的最大值,记块头为\(u\),则\(f[i][j]\)即为区间\([u,j]\)的答案
算出\(f[i][j]\)只需要枚举每个\(j\)就可以了
具体地,\(f[i][j] = max(f[i][j - 1],query(j,区间[u,j - 1]))\)

那么每次询问的时候,对于\(l\)之后的第一个块头\(u\),可以得到出后面的答案\(f[u][r]\)
所以我们只需要计算区间\([l,u - 1]\)的数与其后面的数的最大异或值
这个区间大小不会超过\(\sqrt{n}\),所以可以直接统计

总的复杂度\(O(n\sqrt{n}logn)\)
【坑点,给出的x,y可能超过int范围】

#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#define LL long long int
using namespace std;
const int maxn = 12005,Bit = 31,maxm = 6000000,INF = 100000000;
inline LL read(){LL out = 0,flag = 1; char c = getchar();while (c < 48 || c > 57){if (c == '-') flag = -1; c = getchar();}while (c >= 48 && c <= 57){out = (out << 3) + (out << 1) + c - 48; c = getchar();}return out * flag;
}
LL n,m,A[maxn],sum[maxn],bin[40];
LL f[200][maxn],block[maxn],B,lans;
struct trie{int ch[maxm][2],sum[maxm],rt[maxn],cnt;int ins(int pre,int x){int tmp,u;tmp = u = ++cnt;for (int i = Bit; i >= 0; i--){ch[u][0] = ch[pre][0];ch[u][1] = ch[pre][1];sum[u] = sum[pre] + 1;LL t = x & bin[i]; t >>= i;pre = ch[pre][t];u = ch[u][t] = ++cnt;}sum[u] = sum[pre] + 1;return tmp;}LL query(int u,int v,int x,int dep){if (dep < 0) return 0;LL t = x & bin[dep]; t >>= dep;if (sum[ch[u][t ^ 1]] - sum[ch[v][t ^ 1]])return bin[dep] + query(ch[u][t ^ 1],ch[v][t ^ 1],x,dep - 1);return query(ch[u][t],ch[v][t],x,dep - 1);}
}T;
int main(){bin[0] = 1; for (int i = 1; i <= Bit; i++) bin[i] = bin[i - 1] << 1;n = read(); m = read(); B = (int)sqrt(n) + 1;n++;for (int i = 2; i <= n; i++) A[i] = read();for (int i = 1; i <= n; i++){sum[i] = sum[i - 1] ^ A[i];T.rt[i] = T.ins(T.rt[i - 1],sum[i]);block[i] = i / B;}for (int i = 1; i <= n; i++){if (i == 1 || block[i] != block[i - 1]){int b = block[i];for (int j = i; j <= n; j++){f[b][j] = max(f[b][j - 1],T.query(T.rt[j - 1],T.rt[i - 1],sum[j],Bit));}}}n--;LL l,r,x,y;while (m--){x = read(); y = read();l = min (((x + lans) % n) + 1, ((y + lans) % n) + 1);r = max (((x + lans) % n) + 1, ((y + lans) % n) + 1) + 1;lans = 0;if (block[l] != block[r]) lans = f[block[l] + 1][r];for (int i = l; block[i] == block[l] && i < r; i++){lans = max(lans,T.query(T.rt[r],T.rt[i],sum[i],Bit));}printf("%lld\n",lans);}return 0;
}

转载于:https://www.cnblogs.com/Mychael/p/8711218.html

BZOJ2741 【FOTILE模拟赛】L 【可持久化trie + 分块】相关推荐

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

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

  2. BZOJ2741 【FOTILE模拟赛】L

    一个上午两道题,妥妥的作死... 首先还是按照之前思路建立可持久化trie,然后发现了点问题... trie只能支持对于给定v求出最大xor值,也就是说我们要枚举a[i] (i ∈ [l, r]),于 ...

  3. jzoj5382 [GDOI2018模拟9.21]数列 可持久化trie+分块

    Description n,q<=20000 a[i]<=10^9 Solution 今天场外体验noi刺激战场,发现我只会做T1这种送分题(⊙ˍ⊙),还没切.果然人菜还是要多读书 首先做 ...

  4. 2017.10.14 【FOTILE模拟赛】L 失败总结

    很有代表性的一道题,什么都想不出来 首先有一个套路:区间的问题可以通过前缀和化成两点的问题 然后就是在区间找任意一/两个点的异或值最大, 在trie树上按二进制位从大到小贪心找就可以了 多组询问,所以 ...

  5. 省选模拟赛记录(越往下越新哦~~~)

    LOG 模拟赛 第一次见尼玛这么给数据范围的-- 开考有点困,迷迷糊糊看完了三道题,真的是像老吕说的那样,一道都不会-- 思考T1,感觉有点感觉,但是太困了,就先码了暴力,发现打表可以50分,于是就大 ...

  6. 8月10日模拟赛题解

    前言 这次模拟赛应该是暑假以来最水的一场了,然而本来至少 210210210 的分数愣是被我弄成了 141141141,原因竟然是: const int MAXM = 5e5 + 5;struct e ...

  7. 【NOIP 模拟赛】平均数 涂色游戏 序列题解

    吐槽(完跪):神tmNOIP模拟赛,看到大题头根本高级数据结构什么的想都没想,结果死的很惨,第三题竟然要可持久化线段树,这NOIP我服了. 平均数: 这道题40分相信大家都能拿到,剩下的60分讲真考验 ...

  8. 中山纪中集训游记Day2+8.2模拟赛题解

    Part.I游记 纪中的OJ真的...今天下午又炸一次... 今天模拟赛竟然是考的集训队互测的题...做到自闭... 一开考看见第一题,给我的感觉是要写树套树...然而我不想写... 然后就去看了第二 ...

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

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

最新文章

  1. 错误:不允许有匹配 [xX][mM][lL] 的处理指令目标。
  2. Google Play
  3. python快速获取多个列表的所有组合形式
  4. nginx丢弃http包体处理
  5. java 类 加载 初始化_java中类的初始化和加载
  6. Facebook将偷来的3D对象数据库用于其AI项目:被诉讼
  7. C语言发明人丹尼斯-里奇去世
  8. 服务器日志egl文件,【图片】Liddy's Linux编译日志(版本8.4)【蕾迪猫的linux吧】_百度贴吧...
  9. ISA Server、虚拟机、托管服务器的使用
  10. 【转】推荐一款Java反编译器,比较好用
  11. ACDSee10 正版授权 许可证
  12. 消息队列 RocketMQ原理和使用整理
  13. 可爱精灵宝贝 动态规划讲解
  14. Go学习之编码实现区块链 - 【blockchain】
  15. Wincc 编辑颜色对应c脚本返回的十进制数
  16. 抖音三农号创作者具体应该如何做?
  17. Android 9 wifi PNO 扫描
  18. 机械结构_day12
  19. Mongodb 查询重复数据
  20. ubuntu18 dso安装

热门文章

  1. 泛型类有什么作用_3 分钟带你彻底搞懂 Java 泛型背后的秘密
  2. 【Pytorch神经网络理论篇】 04 Variable类型与自动微分模块剖析
  3. 【Pytorch神经网络基础理论篇】 02 pytorch环境的安装
  4. python装饰器函数执行后日志_python 装饰器理解
  5. 利用回溯法解决1-9之间添加+或-或使得运算结果为100的问题
  6. LeetCode 996. 正方形数组的数目(回溯+剪枝)
  7. LeetCode 910. 最小差值 II(贪心)
  8. 程序员面试金典 - 面试题 17.16. 理发师(动态规划DP)
  9. POJ 1577 Falling Leaves(二叉查找树)
  10. python saltstack web_saltstack web uiweb平台界面