【题解】洛谷P4735最大异或和
学习了一下可持久化trie的有关姿势~其实还挺好理解的,代码也短小精悍。重点在于查询某个历史版本的trie树上的某条边是否存在,同样我们转化到维护前缀和来实现。同可持久化线段树一样,我们为了节省空间继承上一节点未修改的信息,修改的信息我们则新建一条链。节点上我们维护从最初的版本到当前版本这条路径一共出现了多少次,如果查询的最后版本记录这条路径出现的次数 > 查询的第一个版本的上一个版本的这条路径出现的次数,则说明这条路径存在在我们查询的范围内。
对于这道题来说,不大好处理的是查询是一段后缀,而后缀是实时修改的。我们考虑将后缀转化为前缀 :\(x \wedge (a[p] \wedge a[p + 1] ... \wedge a[n]) = x \wedge (a[1] \wedge a[2] ... \wedge a[n] ) \wedge (a[1] \wedge a[2] \wedge ... \wedge a[p - 1])\)。如果将后一个式子转化为前缀异或的形式的话,我们有原式等于 \(x \wedge s[n] \wedge s[p - 1]\)。\(x \wedge s[n]\) 是一个定值,所以我们只需要求出一段前缀与这个定值的异或和即可。所以我们可以利用可持久化trie树,查询对应范围内的值贪心获得答案。
#include <bits/stdc++.h>
using namespace std;
#define maxn 600100
int n, m, tot, root[maxn];
int cnt[maxn * ], ch[maxn * ][];
int s[maxn]; int read()
{
int x = , k = ;
char c; c = getchar();
while(c < '' || c > '') { if(c == '-') k = -; c = getchar(); }
while(c >= '' && c <= '') x = x * + c - '', c = getchar();
return x * k;
} void insert(int now, int pre, int t, int x)
{
if(t < ) return;
int i = (x >> t) & ;
ch[now][!i] = ch[pre][!i];
ch[now][i] = ++ tot;
cnt[ch[now][i]] = cnt[ch[pre][i]] + ;
insert(ch[now][i], ch[pre][i], t - , x);
} int Query(int now, int ath, int t, int x)
{
if(t < ) return ;
int y = (x >> t) & ;
if(cnt[ch[ath][!y]] > cnt[ch[now][!y]])
return ( << t) + Query(ch[now][!y], ch[ath][!y], t - , x);
else return Query(ch[now][y], ch[ath][y], t - , x);
} int main()
{
n = read(), m = read();
root[] = ++ tot; insert(root[], , , );
for(int i = ; i <= n; i ++)
{
int x = read();
s[i] = s[i - ] ^ x; root[i] = ++ tot;
insert(root[i], root[i - ], , s[i]);
}
for(int i = ; i <= m; i ++)
{
scanf("%s", s);
if(s[] == 'A')
{
int x = read(); ++ n; s[n] = s[n - ] ^ x;
root[n] = ++ tot; insert(root[n], root[n - ], , s[n]);
}
else
{
int l = read(), r = read(), x = read();
l --, r --;
if(l == ) printf("%d\n", Query(, root[r], , x ^ s[n]));
else printf("%d\n", Query(root[l - ], root[r], , x ^ s[n]));
}
}
return ;
}
【题解】洛谷P4735最大异或和的更多相关文章
- Bzoj3261/洛谷P4735 最大异或和(可持久化Trie)
题面 Bzoj 洛谷 题解 显然,如果让你查询整个数列的最大异或和,建一颗\(01Trie\),每给定一个\(p\),按照二进制后反方向跳就行了(比如当前二进制位为\(1\),则往\(0\)跳,反之亦 ...
- 洛谷 P4735 最大异或和 解题报告
P4735 最大异或和 题目描述 给定一个非负整数序列\(\{a\}\),初始长度为\(N\). 有\(M\)个操作,有以下两种操作类型: A x:添加操作,表示在序列末尾添加一个数\(x\),序列的 ...
- [洛谷P4735]最大异或和
题目大意:有一串初始长度为$n$的序列$a$,有两种操作: $A\;x:$在序列末尾加一个数$x$ $Q\;l\;r\;x:$找一个位置$p$,满足$l\leqslant p\leqslant r$, ...
- 洛谷 P3359 改造异或树
题目描述 给定一棵n 个点的树,每条边上都有一个权值.现在按顺序删掉所有的n-1条边,每删掉一条边询问当前有多少条路径满足路径上所有边权值异或和为0. 输入输出格式 输入格式: 第一行一个整数n. 接 ...
- 题解 洛谷P5018【对称二叉树】(noip2018T4)
\(noip2018\) \(T4\)题解 其实呢,我是觉得这题比\(T3\)水到不知道哪里去了 毕竟我比较菜,不大会\(dp\) 好了开始讲正事 这题其实考察的其实就是选手对D(大)F(法)S(师) ...
- 题解 洛谷 P3396 【哈希冲突】(根号分治)
根号分治 前言 本题是一道讲解根号分治思想的论文题(然鹅我并没有找到论文),正 如论文中所说,根号算法--不仅是分块,根号分治利用的思想和分块像 似却又不同,某一篇洛谷日报中说过,分块算法实质上是一种 ...
- 题解-洛谷P5410 【模板】扩展 KMP(Z 函数)
题面 洛谷P5410 [模板]扩展 KMP(Z 函数) 给定两个字符串 \(a,b\),要求出两个数组:\(b\) 的 \(z\) 函数数组 \(z\).\(b\) 与 \(a\) 的每一个后缀的 L ...
- 题解-洛谷P4229 某位歌姬的故事
题面 洛谷P4229 某位歌姬的故事 \(T\) 组测试数据.有 \(n\) 个音节,每个音节 \(h_i\in[1,A]\),还有 \(m\) 个限制 \((l_i,r_i,g_i)\) 表示 \( ...
- 题解-洛谷P4724 【模板】三维凸包
洛谷P4724 [模板]三维凸包 给出空间中 \(n\) 个点 \(p_i\),求凸包表面积. 数据范围:\(1\le n\le 2000\). 这篇题解因为是世界上最逊的人写的,所以也会有求凸包体积 ...
随机推荐
- LeetCode: 54. Spiral Matrix(Medium)
1. 原题链接 https://leetcode.com/problems/spiral-matrix/description/ 2. 题目要求 给定一个二维整型数组,返回其螺旋顺序列表,例如: 最后 ...
- crash:EXC_ARM_DA_ALIGN(关于内存对齐,memcpy)
crash:EXC_ARM_DA_ALIGN(关于内存对齐,memcpy) 问题描述 在iOS game开发时做内存拷贝时出现了 crash:EXC_ARM_DA_ALIGN,debug版本不会出现, ...
- 「日常训练」Watering Flowers(Codeforces Round #340 Div.2 C)
题意与分析 (CodeForces 617C) 题意是这样的:一个花圃中有若干花和两个喷泉,你可以调节水的压力使得两个喷泉各自分别以\(r_1\)和\(r_2\)为最远距离向外喷水.你需要调整\(r_ ...
- web漏洞原理 (需要每周更新此篇文章)
SQL注入攻击简介 结构化查询语言SQL是用来和关系数据库进行交互的文本语言.它允许用户对数据进行有效的管理,包含了对数据的查询.操作.定义和控制等几个方面,例如向数据库写入.插入数据,从数据库读取数 ...
- 180615-精度计算BigDecimal
文章链接:https://liuyueyi.github.io/hexblog/2018/06/15/180615-精度计算BigDecimal/ 180615-精度计算BigDecimal 目前接触 ...
- Linux命令应用大词典-第19章 文件系统管理
19.1 mkfs:创建Linux文件系统 19.2 mke2fs:创建ext2.3.4文件系统 19.3 mkfs.ext4:创建ext4文件系统 19.4 mkfs.ext3:创建ext3文件系统 ...
- 韦大仙--python对文件操作
文件操作: 对文件操作流程 打开文件,得到文件句柄并赋值给一个变量 通过句柄对文件进行操作 关闭文件 现有文件如下 Somehow, it seems the love I knew was alwa ...
- 前端开发工程师 - 05.产品前端架构 - 协作流程 & 接口设计 & 版本管理 & 技术选型 &开发实践
05.产品前端架构 第1章--协作流程 WEB系统 角色定义 协作流程 职责说明 第2章--接口设计 概述 接口规范 规范应用 本地开发 第3章--版本管理 见 Java开发工程师(Web方向) - ...
- leetcode-组合总数IV(动态规划)
377. 组合总和 Ⅳ 给定一个由正整数组成且不存在重复数字的数组,找出和为给定目标正整数的组合的个数. 示例: nums = [1, 2, 3] target = 4 所有可能的组合为: (1, ...
- Java学习 · 初识 异常机制
异常机制 1. 程序中的异常 a) b) 面对异常如何解决 i. 由开发者通过if-else来解决 代码臃肿 程序员需要花费很大精力 ii. ...