题目链接

洛谷P4735 最大异或和

题目描述

给定一个非负整数序列 a{a}a,初始长度为nnn。

有 mmm 个操作,有以下两种操作类型:

  1. A x:添加操作,表示在序列末尾添加一个数 xxx,序列的长度 n+1n+1n+1。
  2. Q l r x:询问操作,你需要找到一个位置 ppp,满足lll≤\le≤ppp≤\le≤rrr,使得:a[p]a[p]a[p]⊕\oplus⊕a[p+1]a[p+1]a[p+1]⊕\oplus⊕………⊕\oplus⊕a[N]a[N]a[N]⊕\oplus⊕xxx最大,输出最大是多少。

数据范围

N,M≤300000N,M\le300000N,M≤300000 , 0≤a[i]≤1070\le a[i]\le 10^70≤a[i]≤107

解题思路

要求:
res=res=res=maxmaxmax(a[p]⊕(a[p]\oplus(a[p]⊕a[p+1]⊕a[p+1]\oplusa[p+1]⊕.........⊕a[N]\oplus a[N]⊕a[N]⊕x)\oplus x)⊕x)(l≤p≤r)(l\le p\le r)(l≤p≤r)
所以我们令数组sss:
s[i]=a[1]⊕a[2]⊕...⊕a[i]s[i]=a[1]\oplus a[2] \oplus ... \oplus a[i]s[i]=a[1]⊕a[2]⊕...⊕a[i]
根据异或的运算,我们可知(i<j)(i<j)(i<j)
s[i]⊕s[j]=a[i+1]⊕a[i+2]⊕...⊕a[j]s[i]\oplus s[j]=a[i+1]\oplus a[i+2]\oplus...\oplus a[j]s[i]⊕s[j]=a[i+1]⊕a[i+2]⊕...⊕a[j]
所以我们可以等价替换为:
res=res=res=maxmaxmax(a[p−1]⊕a[N](a[p-1]\oplus a[N](a[p−1]⊕a[N]⊕x)\oplus x)⊕x)(l≤p≤r)(l\le p\le r)(l≤p≤r)
所以我们只需保存每个点的异或前缀和
然后在使用数据结构来储存的时候,只需要在区间l−1≤p≤r−1l-1\le p\le r-1l−1≤p≤r−1内即可

这就是我们用到的可持久化字典树

AC代码

#include<bits/stdc++.h>
using namespace std;const int N = 600010, M = N * 25; //30w数据和30w新增,2e7小于2^24,算上根节点,每个数需要25位int n, m, x;
int s[N];                   //记录异或前缀和
int tr[M][2], max_id[M];    //max_id 当前点对应要存的数的在前缀和数组s的位置
int root[N], idx;           //根节点//使用递归处理
//i为下标,k为当前处理的位数,p为上一个节点,q为当前节点
void insert(int i, int k, int p, int q)
{if (k < 0)              //处理完最后一位,q为叶节点{max_id[q] = i;      //记录当前节点所能达到的最大范围return;}int v = s[i] >> k & 1;  //取出第k位的v//如果前一个节点存在当前节点没有的分支,那就把当前节点指向前一个节点if (p) tr[q][v ^ 1] = tr[p][v ^ 1];//tire树的插入tr[q][v] = ++idx;//递归插入下一位的二进制,insert(i, k - 1, tr[p][v], tr[q][v]);//递归结束后进行,把最大的max_id传回来,所以先递归子节点,再修改父节点max_id[q] = max(max_id[tr[q][0]], max_id[tr[q][1]]);
}int query(int l, int r, int C)             //C为插入的值
{int p = root[r];for (int i = 23; ~i; i--){//C = s[n] ^ x,从高到低逐位检索每一位上能与C异或最大的数int v = C >> i & 1;//max_id限制当前节点在[l, r]内//如果没有初始化max_id[0] = -1,当l = 0的时候就会跳到空节点if (max_id[tr[p][v ^ 1]] >= l) p = tr[p][v ^ 1];else p = tr[p][v];}return C ^ s[max_id[p]];
}int main()
{scanf("%d%d", &n, &m);//初始化max_id[0] = -1;root[0] = ++idx;insert(0, 23, 0, root[0]);for (int i = 1; i <= n; i++){scanf("%d", &x);s[i] = s[i - 1] ^ x;  //异或前缀和root[i] = ++idx;insert(i, 23, root[i - 1], root[i]);}char op[2];int l, r;while(m--){scanf("%s", op);if (*op == 'A')     //插入{scanf("%d", &x);n++; s[n] = s[n - 1] ^ x;root[n] = ++idx;insert(n, 23, root[n - 1], root[n]);} else{scanf("%d%d%d", &l, &r, &x);printf("%d\n", query(l - 1, r - 1, s[n] ^ x));}}return 0;
}

插入函数也可以使用非递归的写法

void insert(int k, int p, int q)
{max_id[q] = k;for(int i = 23; ~i; i --){int v = s[k] >> i & 1;if(p) tr[q][v ^ 1] = tr[p][v ^ 1];tr[q][v] = ++idx;max_id[tr[q][v]] = k;q = tr[q][v], p = tr[p][v];}
}

洛谷P4735 最大异或和相关推荐

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

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

  2. 洛谷 P4735 最大异或和

    一.题目: 洛谷原题 二.思路: 这是一道可持久化trie的板子题. 三.代码: #include<iostream> #include<cstdio> #include< ...

  3. [洛谷P4735]最大异或和

    题目大意:有一串初始长度为$n$的序列$a$,有两种操作: $A\;x:$在序列末尾加一个数$x$ $Q\;l\;r\;x:$找一个位置$p$,满足$l\leqslant p\leqslant r$, ...

  4. 洛谷 P3359 改造异或树

    传送门 30分做法:(边权为0) 我一开始就在想30分做法,然后就想到了: 首先老套路,正着删边就是倒着加边. 并查集维护连通块大小,每次加边后将两个端点的size值乘起来累加答案. 20分做法: 当 ...

  5. 洛谷-4735 最大异或和 /【模板】可持久化Trie

    题目描述 给定一个非负整数序列 {a}\{a\}{a},初始长度为n. 有 m 个操作,有以下两种操作类型: A x:添加操作,表示在序列末尾添加一个数 x,序列的长度 n+1. Q l r x:询问 ...

  6. YBTOJ洛谷P4551:最长异或路径(trie树)

    洛谷传送门 文章目录 题目描述 解析 代码 题目描述 解析 本题关键就在于一点: 若把每个点的深度dep[i]定义为从根到节点边权的异或和 那么i到j的路径异或和可以表示为: dep[i] ^ dep ...

  7. P4735 最大异或和 01可持久化Trie树模板

    原题:https://www.luogu.org/problemnew/show/P4735 题解:观察一下式子,将a数组求一个异或前缀和,其实就是s[n]^x^s[p-1]的最大值 p∈[l,r], ...

  8. 洛谷P3688/uoj#291. [ZJOI2017]树状数组

    传送门(uoj) 传送门(洛谷) 这里是题解以及我的卡常数历程 话说后面那几组数据莫不是lxl出的这么毒 首先不难发现这个东西把查询前缀和变成了查询后缀和,结果就是查了\([l-1,r-1]\)的区间 ...

  9. 洛谷 P4151 BZOJ 2115 [WC2011]最大XOR和路径

    //bzoj上的题面太丑了,导致VJ的题面也很丑,于是这题用洛谷的题面 题面描述 XOR(异或)是一种二元逻辑运算,其运算结果当且仅当两个输入的布尔值不相等时才为真,否则为假. XOR 运算的真值表如 ...

最新文章

  1. python画心形图像
  2. tensorflow 运行报错 runtime error use a closed session
  3. eruke注册中心搭建
  4. 数据库-聚合函数-count-sum
  5. 时间序列分析之:傅里叶变换找周期
  6. 改了一行代码,MySQL查询效率提升了80%,老板奖了我50万
  7. js 的正则表达式 部分展示test()方法的验证功能
  8. mysql当时读_Mysql事务以及四中隔离级别实例2以及InnoDB如何解决当时读的幻读问题...
  9. 地税某数据库异常重启和重启后数据库运行缓慢问题的解决过程
  10. WinDbg / SOS Cheat Sheet
  11. LeaRun.Java表单快速开发工具
  12. 采用参数服务器的分布式机器学习
  13. LED恒流驱动IC汇总
  14. KGB知识图谱帮助金融机构进行风险预判
  15. 本地系统盘放到服务器上,怎么把本地盘挂到云服务器
  16. 微信公众号html在线编辑器,【微信公众平台工具开发】雷人微信网页编辑器
  17. 步步高s5pro和s5区别
  18. 华为云灾备,让数据风险无处遁形
  19. 数据结构(C语言)第二版 第四章课后答案
  20. Android函数响应式编程——RxJava最快速度入门

热门文章

  1. 面向对象程序设计c++版董正言张聪课本课后习题答案第三章
  2. @Aspect aop切面获取请求接口类名、方法名、及参数
  3. Java Web学习(2):静态网页与动态网页
  4. java里如何表示黑桃方片_扑克红桃,方片,黑桃,梅花他们的顺序如何,代表什么意义呀?jac 爱问知识人...
  5. 群联PS3111+7DDL+JMS578转接板,开卡pSLC,附PS3111量产工具
  6. css硬件加速_CSS动画的硬件加速简介
  7. 重磅!华为宣布起诉美国政府
  8. [MB855]变砖解决
  9. Java 中this和super的用法总结
  10. java应用程序接口批量访问_spring中使用mybatis实现批量插入的示例代码