01trie】的更多相关文章

指针版 #define MAXNUM 26 //定义字典树结构体 typedef struct Trie { bool flag;//从根到此是否为一个单词 Trie *next[MAXNUM]; }Trie; //声明一个根 Trie *root; //初始化该根 void init() { root = (Trie *)malloc(sizeof(Trie)); root->flag=false; ;i<MAXNUM;i++) root->next[i]=NULL; } //对该字典…
[十二省联考2019]异或粽子 01trie 链接 luogu 思路 首先求前k大的(xo[i]^xo[j])(i<j). 考场上只想到01trie,不怎么会写可持久,就写了n个01trie,和直接sort一样.. 咳咳,官方题解是. 一个堆维护i为终点,可以取得位置为\([L,R]\)的最大值为val. 每次选最大的,然后将这个点分裂成两个: i为终点,可以取得位置为\([L,x-1]\)的最大值为\(val_1\). i为终点,可以取得位置为\([x+1,R]\)的最大值为\(val_2\)…
题意 题目链接 可持久化01Trie板子题 对于两个操作分别开就行了 #include<bits/stdc++.h> using namespace std; const int MAXN = 4e5 + 10, SS = MAXN * 42 + 10; const int B = 31; inline int read() { char c = getchar(); int x = 0, f = 1; while(c < '0' || c > '9') {if(c == '-')…
题目链接 [洛谷传送门] [LOJ传送门] 题目大意 让你求区间异或和前\(k\)大的异或和的和. 正解 这道题目是Blue sky大佬教我做的(祝贺bluesky大佬进HA省A队) 我们做过某一些题目,非常的相似.[超级钢琴]还有[最小函数值]还有[最大异或和] 感觉这一些题目拼在一起就变成了这一道水题. 首先我们需要预处理出,所有区间的异或最大值. 这个东西可以用可持久化\(01trie\)实现,那么我们思考一下如何实现查询第\(k\)大的值的操作. 以下是关于01字典树中查询第k大的操作的…
题目链接 [BZOJ传送门] [洛谷传送门] 题解 终于学会了可持久化trie树了.感觉并不是特别的难. 因为可持久化,那么我们就考虑动态开点的trie树. 都知道异或操作是有传递性的,那么我们就维护一个前缀异或和. [最长异或距离] 可以参考以上这一道题目的贪心策略. 每次找到另外一边的(说的清楚一点就是每一次找字典树的儿子都找异或的数当前这一位的异或1的值),这样可以保证疑惑后答案最大. 参照主席树的区间最小的求法:[洛谷的模板] 每一次我们就查找root[l - 1] ~ root[r]区…
传送门 题意:序列上有nnn个商店,有两种事件会发生: sss商店上进购标价为vvv的一个物品 求编号为[l,r][l,r][l,r]之间的位置买ddd天内新进购的所有物品与一个数xxx异或值的最大值. 每个位置都有一种物品每天会新进购(最开始会给出). 思路: 第一眼显然的线段树套可持久化01trie 恭喜MLE走人 然后发现每个人的询问可以放到按时间建出的线段树上,这个不就可以线段树分治离线处理了吗. 于是把每天进购的物品排个序下放,每一层线段树用一个可持久化01trie来统计答案即可(注意…
传送门 01trie板子题. 给出两个数列,允许把第二个数列重新排列. 求使得两个数列每个位置对应的数的异或值和成为最小值的每个位置的异或和. 把第二个数列插入到01trie里面然后对于第一个数列中的数挨个询问最小异或和即可. 代码: #include<bits/stdc++.h> #define ri register int using namespace std; const int N=3e5+5,P=30; int n,son[N*30][2],siz[N*30],a[N],tot=…
传送门 直接把每个点到根节点的异或距离插入01trie. 然后枚举每个点在01trie上匹配来更新答案就行了. 代码: #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; inline int read(){ int ans=0; char ch=getchar(); while(!isdigit(ch))ch=getch…
这里用递归实现01-trie, 可以看做是区间长度为2的幂的权值线段树, 能实现权值的所有操作, 异或时, 翻转左右儿子即可. 练习1 CF 817E Choosing The Commander 大意: 要求维护一个集合, 给定三种操作: 1. 插入属性$p_i$的元素 2. 删除属性$p_i$的元素 3. 询问集合中有多少元素异或$p_i$后的值小于$l_i$ 算是比较简单的01-trie入门题, 假若每次都异或0的话, 完全就是裸的权值, 非0的话, 对于非0位翻转左右儿子即可 #incl…
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4137 关于可持久化01trie树:https://www.cnblogs.com/LadyLex/p/7281110.html 看了看它的两道例题,就没写. 特殊商品可以直接用可持久化trie做. 其他部分用线段树分治.修改是单点的,询问是区间,原来想的是把询问区间定位后有 mlogn 个,在线段树的每个叶子上贡献一番:结果TLE了,因为若是在叶子处贡献,一个询问就要做 r-l+1 次.…
传送门 数据结构经典题. 首先考虑另外一种询问方式. 已知权值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…
传送门 01trie经典题目. 我们可以通过计算每个数作为次小值时对答案的贡献. 显然对于每个iii需要求出一个包含a[i]a[i]a[i]且的区间[l,r][l,r][l,r]且区间所有值都小于a[i]a[i]a[i] 于是将原数组排序之后用双向链表维护. 接着用01trie贪心求出贡献. #include<bits/stdc++.h> #define N 200005 #define P 30 using namespace std; inline int read(){ int ans=…
hyc的xor/mex 描述 NOIP2017就要来了,备战太累,不如做做hyc的新题? 找回自信吧! 一句话题意:n个数,m个操作 操作具体来讲分两步 1.读入x,把n个数全部xor上x 2.询问当前n个数的mex 意味着每次操作后你都需要输出一次 (注意:是mex,即集合内未出现过的最小非负整数 举2个例子 mex(4,33,0,1,1,5)=2 mex(1,2,3)=0) 输入 第一行两个整数n,m 意义同题面(1 ≤ n, m ≤ 3 * 10^5) 第二行 n个数 ai (0 ≤ ai…
xorand 描述 有q次操作,每次操作是以下两种: 1. 加入一个数到集合中 2. 查询,查询当前数字与集合中的数字的最大异或值,最大and值,最大or值 输入 第一行1个正整数Q表示操作次数 接下来Q行,每行2个数字,第一个数字是操作序号OP(1,2),第二个数字是X表示操作的数字 输出 输出查询次数行,每行3个整数,空格隔开,分别表示最大异或值,最大and值,最大or值 样例输入 [输入样例1] 5 1 2 1 3 2 4 1 5 2 7 [输出样例1] 7 0 7 5 5 7 [样例解释…
这一次,我们来了解普通Trie树的变种:0-1Trie以及在其基础上产生的可持久化Trie(其实,普通的Trie也可以可持久化,只是不太常见) 先简单介绍一下0-1Trie:一个0-1Trie节点只有两个子节点,分别代表0和1:从根节点开始,第一层代表限制的最高位,依次往下直到最底层,代表二进制第0位. 0-1Trie上的一条链所表示的数字,就是Trie树中的一个数字.0-1Trie除了节点和插入方式与普通的Trie树略有不同之外,其他操作都是和Trie树完全一样的.在维护这个节点插入过的数的个…
$ \color{#0066ff}{ 题目描述 }$ 小粽是一个喜欢吃粽子的好孩子.今天她在家里自己做起了粽子. 小粽面前有 \(n\) 种互不相同的粽子馅儿,小粽将它们摆放为了一排,并从左至右编号为 \(1\) 到 \(n\).第 \(i\) 种馅儿具有一个非负整数的属性值 \(a_i\).每种馅儿的数量都足够多,即小粽不会因为缺少原料而做不出想要的粽子.小粽准备用这些馅儿来做出 \(k\) 个粽子. 小粽的做法是:选两个整数数 \(l\), \(r\),满足 \(1 \leqslant l…
$ \color{#0066ff}{ 题目描述 }$ Welcome to ALO ( Arithmetic and Logistic Online).这是一个 VR MMORPG, 如名字所见,到处充满了数学的谜题 现在你拥有 n 颗宝石,每颗宝石有一个能量密度,记为 ai,这些宝石的能量 密度两两不同.现在你可以选取连续的一些宝石(必须多于一个)进行融合,设 为 ai, ai+1, -, aj,则融合而成的宝石的能量密度为这些宝石中能量密度的次大值 与其他任意一颗宝石的能量密度按位异或的值,…
CF923C Perfect Security 上下各n个数,求一种排列p,使上面的数i异或pi成为新的数i,求方案另字典序最小,输出该结果 01Trie树. 记录每个节点经过多少次. 每一次查询的时候将经过的点的标记加1. 那么当我们要去走某一个节点的时候,就去判断他的标记是否小于初始的值,如果不是那么就不能走. 教训告诉我们一定要想好细节再打代码,我没想好怎么处理初始标记就去写了个拓扑排序.低智低智... code: #include <iostream> #include <cst…
3261: 最大异或和 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 3519  Solved: 1493[Submit][Status][Discuss] Description 给定一个非负整数序列{a},初始长度为N. 有M个操作,有以下两种操作类型: 1.Ax:添加操作,表示在序列末尾添加一个数x,序列的长度N+1. 2.Qlrx:询问操作,你需要找到一个位置p,满足l<=p<=r,使得: a[p] xor a[p+1] xor ...…
1295 XOR key 2 秒 262,144 KB 160 分 6 级题   给出一个长度为N的正整数数组A,再给出Q个查询,每个查询包括3个数,L, R, X (L <= R).求A[L] 至 A[R] 这R - L + 1个数中,与X 进行异或运算(Xor),得到的最大值是多少? 收起   输入 第1行:2个数N, Q中间用空格分隔,分别表示数组的长度及查询的数量(1 <= N <= 50000, 1 <= Q <= 50000). 第2 - N+1行:每行1个数,对…
题目描述 给定一棵 n 个点的带权树,结点下标从 1 开始到 N .寻找树中找两个结点,求最长的异或路径. 异或路径指的是指两个结点之间唯一路径上的所有边权的异或. 个人: 首先强推一下01字典树(Trie),这个东西是解决xor问题的利器. 查找最大异或值的时候我们一般从最高位到低位向下找 eg: 1000(2)=8(10) 0111(2)=7(10) 显然只要我的最高位是1,除非你和我的最高位相同,要不然我就是比你大. 根据数学上的等比数列求和可知 8=2^3 ,7=2^3-1 所以说我们可…
Description 现在有一颗以\(1\)为根节点的由\(n\)个节点组成的树,树上每个节点上都有一个权值\(v_i\).现在有\(Q\)次操作,操作如下: 1\(\;x\;y\):查询节点\(x\)的子树中与\(y\)异或结果的最大值 2\(\;x\;y\;z\):查询路径\(x\)到\(y\)上点与\(z\)异或结果最大值 Input 第一行是两个数字\(n,Q\); 第二行是\(n\)个数字用空格隔开,第\(i\)个数字\(v_i\)表示点\(i\)上的权值 接下来\(n-1\)行,每…
Description 给定一个非负整数序列\(\{a\}\),初始长度为\(N\). 有\(M\)个操作,有以下两种操作类型: A x:添加操作,表示在序列末尾添加一个数\(x\),序列的长度\(N+1\). Q l r x:询问操作,你需要找到一个位置\(p\),满足\(l \leq p \leq r\),使得: \(a[p] \oplus a[p+1] \oplus ... \oplus a[N] \oplus x\) 最大,输出最大是多少. Input 第一行包含两个整数 \(N,M\)…
我们观察数据:树套树 PASS    主席树 PASS  一层一个Trie PASS 再看,异或!我们就把目光暂时定在01Tire然后我们发现,我们可以带着一堆点在01Trie上行走,因为O(n*q*30+m*30)是一个可选复杂度. 我们想一下我们正常的时候的01Trie其实是通过在每一层比较大小来确定这一为是0还是1,所以我们从上到下一位一位地走,统计每在这一位异或值为1的数的个数,如果这一位是一的个数大于k那么我们就使这一位为1,那么我们就舍弃这一位为0的状态就是所有的点都走变为1的路,如…
直接上代码 正所谓 人傻自带大常数 平衡树的几种姿势:  AVL Red&Black_Tree 码量爆炸,不常用:SBT 出于各种原因,不常用. 常用: Treap 旋转 基于旋转操作和随机数堆 但不支持区间操作. 非旋转 基于随机数堆和拆分合并操作 常数较大 时间复杂度:很难被卡,均摊O(logN) #include<cstdio> #include<iostream> #include<cstdlib> #define MAXN 100005 using n…
Description 给定一些数,求这些数中两个数的异或值最大的那个值 Input 多组数据.第一行为数字个数n,1 <= n <= 10 ^ 5.接下来n行每行一个32位有符号非负整数. Output 任意两数最大异或值 Sample Input 3 3 7 9 Sample Output 14 Hint Source CSGrandeur的数据结构习题 毒瘤老师给学弟们出这种题真的好么qwq. 难不成想让他们现场构造01trie这种数据结构?雾 #include<cstdio>…
做一个树上前缀异或和,然后把前缀和插到$01trie$里,然后再对每一个前缀异或和整个查一遍,在树上从高位向低位贪心,按位优先选择不同的,就能贪出最大的答案. #include<cstdio> #include<iostream> #include<algorithm> #include<cstring> #include<cmath> #include<cctype> #include<cstdlib> #include…
好题...开阔思路 把每个前缀异或和依次插入$01trie$,插之前找一个最优的(就是从高位向低位贪心,尽量走相反方向)看看能不能更新答案,此时相当于找到了区间右端点不超过某个点$r$的最大或和$f[r]$.对于后缀也同理来一波上面的操作,然后就找到了区间左端点端点不少于某个点$l$的最大异或和.所以答案就是$max(f[某个位置]+query(下个位置开始的后缀))$. #include<cstdio> #include<iostream> #include<algorit…
题目大意:给你一个序列,共有$q$个询问,每次询问区间$[L,R]$内最大连续字段异或和,强制在线,$n<=12000,m<=5000$ 有个细节没处理好$WA$了好久..还有一次$ans$没清零 先对序列建出可持久化$01Trie$ 分块预处理出,任意两块所覆盖区域的最大$xor$和,枚举右侧块内的每个数,然后在$01Trie$里查找即可,预处理总时间$O(n \sqrt n)$ 对于每次询问,中间部分的答案可以$O(1)$得到 边界情况,左侧不完整块内的每个数都要分别作为区间左端点和右端点…
题目大意:给你一个长方形矩阵,位置$i,j$上的数是$a_{i}\;xor\;b_{j}$,求某个子矩阵内第$K$大的值 最先想的是二分答案然后验证,然而是$O(qnlogmloga_{i})$,不出意外会被卡..看完题解才恍然大悟 $01Trie$是具有二分性质的!因为每个节点最多有2个儿子! 先对$b$序列建可持久化$01Trie$,记录一个$sum$表示当前节点的子树内有多少个数 对于每次询问,因为$n$很小,暴力枚举$a$进行统计,记录每个a当前在01Trie的位置 接下来就是在$01T…