BZOJ 2741 L (可持久化01Trie+分块)】的更多相关文章

题目大意:给你一个序列,共有$q$个询问,每次询问区间$[L,R]$内最大连续字段异或和,强制在线,$n<=12000,m<=5000$ 有个细节没处理好$WA$了好久..还有一次$ans$没清零 先对序列建出可持久化$01Trie$ 分块预处理出,任意两块所覆盖区域的最大$xor$和,枚举右侧块内的每个数,然后在$01Trie$里查找即可,预处理总时间$O(n \sqrt n)$ 对于每次询问,中间部分的答案可以$O(1)$得到 边界情况,左侧不完整块内的每个数都要分别作为区间左端点和右端点…
传送门 解题思路 首先求出前缀异或和,那么问题就转化成了区间内选两个数使得其异或和最大.数据范围不是很大考虑分块,设\(f[x][i]\)表示第\(x\)块开头到\(i\)这个位置与\(a[i]\)异或得到的最大的数,而对\(f\)求前缀\(max\)就可以得出每一块的开头到后面任意一点的区间内异或最大.而求\(f\)的过程实际是从区间内取一个数和给定数异或和最大,那么这个可以用\(0/1\) \(Trie\)来做,就可以造一棵可持久化\(Trie\).询问时整块直接调用\(f\),前面的小块直…
传送门 数据结构经典题. 首先考虑另外一种询问方式. 已知权值val,在区间[1,n][1,n][1,n]中找一个数使得valvalval^a[i]a[i]a[i]最大. 这个可以直接01trie. 那么变成区间[l,r][l,r][l,r]之后显然可以用可持久化01trie. 但是现在不知道权值val. 所以我们用分块预处理把时间复杂度变成O(n∗sqrt(n)∗logn)O(n*sqrt(n)*logn)O(n∗sqrt(n)∗logn)的. 具体来说就是mx[i][j]mx[i][j]mx…
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4137 关于可持久化01trie树:https://www.cnblogs.com/LadyLex/p/7281110.html 看了看它的两道例题,就没写. 特殊商品可以直接用可持久化trie做. 其他部分用线段树分治.修改是单点的,询问是区间,原来想的是把询问区间定位后有 mlogn 个,在线段树的每个叶子上贡献一番:结果TLE了,因为若是在叶子处贡献,一个询问就要做 r-l+1 次.…
题目大意:给你一个长方形矩阵,位置$i,j$上的数是$a_{i}\;xor\;b_{j}$,求某个子矩阵内第$K$大的值 最先想的是二分答案然后验证,然而是$O(qnlogmloga_{i})$,不出意外会被卡..看完题解才恍然大悟 $01Trie$是具有二分性质的!因为每个节点最多有2个儿子! 先对$b$序列建可持久化$01Trie$,记录一个$sum$表示当前节点的子树内有多少个数 对于每次询问,因为$n$很小,暴力枚举$a$进行统计,记录每个a当前在01Trie的位置 接下来就是在$01T…
题目大意:给你一个序列,求出第$K$大的两两异或值 先建出来可持久化$01Trie$ 用一个$set$/堆存结构体,存某个异或对$<i,j>$的第二关键字$j$,以及$ai\;xor\;aj$的值,堆中按异或值从小到大排序 每次取出一对$<i,j>$并把它从堆中删除 在$[0,j-1]$的 可持久化$01Trie$ 中把$a_{i}$这个数删除 再查询$[0,j-1]$中和$a_{j}$的异或最大值,重新推入堆中... 反复操作$K$次即可 删除操作中的细节比较多 #include…
题目大意:让你维护一个序列,支持在序列末插入一个数,支持询问$[l,r]$区间内选择一个位置$p$,使$xor\sum_{i=p}^{n}a_{i}$最大 可持久化$01Trie$裸题,把 区间异或和 转化为区间端点前缀异或和的异或值 即求$xsum_{n}\;xor\;max(xsum_{i})i\in[l-1,r-1]$的最大值 那么在可持久化$01Trie$里是$r-1$的$Trie$对$l-2$的$Trie$做差 需要先把$0$推入$Trie$里 #include <cmath> #i…
题目链接 [BZOJ传送门] [洛谷传送门] 题解 终于学会了可持久化trie树了.感觉并不是特别的难. 因为可持久化,那么我们就考虑动态开点的trie树. 都知道异或操作是有传递性的,那么我们就维护一个前缀异或和. [最长异或距离] 可以参考以上这一道题目的贪心策略. 每次找到另外一边的(说的清楚一点就是每一次找字典树的儿子都找异或的数当前这一位的异或1的值),这样可以保证疑惑后答案最大. 参照主席树的区间最小的求法:[洛谷的模板] 每一次我们就查找root[l - 1] ~ root[r]区…
题面传送门 题目大意:给你一个序列,多次询问,每次取出一段连续的子序列$[l,r]$,询问这段子序列的逆序对个数,强制在线 很熟悉的分块套路啊,和很多可持久化01Trie的题目类似,用分块预处理出贡献,而这道题是用可持久化线段树罢了 首先对序列分块,设块大小为$S$ 再建出主席树,我们就能在$O(logn)$时间内查询某个点$i$与区间$[l,r]$内的点产生的逆序对数量 然后处理出点和整块之间的答案,设$f(i,j)$表示第$i$个点与第$j$块的开始/末尾这段区间内的点产生的逆序对数量. 再…
传送门 题意:序列上有nnn个商店,有两种事件会发生: sss商店上进购标价为vvv的一个物品 求编号为[l,r][l,r][l,r]之间的位置买ddd天内新进购的所有物品与一个数xxx异或值的最大值. 每个位置都有一种物品每天会新进购(最开始会给出). 思路: 第一眼显然的线段树套可持久化01trie 恭喜MLE走人 然后发现每个人的询问可以放到按时间建出的线段树上,这个不就可以线段树分治离线处理了吗. 于是把每天进购的物品排个序下放,每一层线段树用一个可持久化01trie来统计答案即可(注意…