草!自闭了!
重要等级 \(1\sim 5\),越大越重要!
- 左偏树 二项堆 PBDS!这是啥!
- 标记永久化 线段树合并/分裂 zkw 树状数组二分!好像不算太难!
- dsu on tree
- splay treap 替罪羊树!学不会!好难!
- 笛卡尔树!不难!
- LCT 草你妈!
- 树套树!
- 莫队 块长 \(B=\frac{n}{\sqrt q}\) 难的:回滚莫队!树上莫队!带修莫队!
- 李超树 树分治
- 点分治/边分治
- 树套数
可持久化可以将树套树优化掉一个log,例如区间第 \(k\) 大。
树状数组:
每个节点 \(i\) 维护 \(i-lowbit(i)+1\sim i\) 这段区间的信息,每个点的父亲节点为 \(i+lowbit(i)\),例如 \(4,6,7\) 的父亲均为 \(8\),还不是很理解维护区间端点与父亲节点的关系,可能得再想想/kel。
用此性质可以做到 \(O(n)\) 建树。
二分的话考虑对于一个 \(x\) ,将其加上 \(2^i\) 将其变成 \(y\),则原来的前缀 \(sum_x\) 变成了 \(sum_y\) 为啥呢?考虑性质一,那么考虑使用倍增的方法维护即可,很简单。
左偏树:
满足堆的性质,当不是二叉树。
将至多一个儿子的节点叫为外节点。
考虑设 \(dis(i)\) 代表第 \(i\) 号节点到外节点的距离的最小值。
左偏树具有的性质是对于任意节点 \(i\) ,均有 \(dis(ls_i)\leq dis(rs_i)\)。
所以每个点的距离最大是 \(\log\)。
合并操作:不断在递归,若违反性质则交换子树,合并的方法好像和堆的很像!。
线段树合并/分裂:
合并:很简单,但是需要注意复杂度是否正确,这个玩意复杂度不总是对的,可以找几个题分析一下。
分裂:也不难,考虑例子,将一棵线段树分成 \(A,B\)两颗,其中 \(\leq k\) 的放在 \(A\),其余放在 \(B\),先二分找到分界点 \(p\),再想想。
总结:数据结构分裂合并操作一般不是真的去搞,而是直接传指针,复杂度需要具体分析。
莫队相关:
树上莫队:
- LG4618树上莫队
简单说一下树上莫队,首先求出该树的欧拉序 \(a\)(不是dfs序!)
这样我们就把树上问题转化到了序列上的问题,考虑对于节点 \(i\),维护 \(st_i\) 和 \(ed_i\) 分别代表该节点第一次在 \(a\) 中的位置和最后一次的位置。
考虑讲询问转化为区间的形式,对于一个询问 \(x,y\),另 \(st_x<st_y\)(若 \(x,y\) 无祖先关系,那么一定有 \(ed_x<st_y\)。
若 \(LCA(x,y)=x\),那么说明此时 \(x,y\) 构成一条链,另询问区间 \([l=st_x,r=st_y]\)。
否则,那么询问区间为 \([l=ed_x,r=st_y]\),然后跑莫队即可,不统计出现 \(2\) 次的答案。
注意会带来不止 \(2\) 的常数。。一个细节是,LCA的答案不会被统计,单独算一下就行。 - LG4074糖果公园
树上莫队+带修莫队。 - LG2325王室联邦
有个不知道对不对的做法,到时候试试。
带修莫队:
考虑加入时间维,使得操作可撤回,时间复杂度还要学习一下。
回滚莫队:
例题:LOJ2874历史研究
其实没有那么难,简单的很。
考虑按照原来的方法排序,然后对于块 \(x\) 统一考虑。
先把 \(ql,qr\) 都在 \(x\) 内的暴力算出来,不影响复杂度。
考虑将 \(l\) 置于 \(x\) 的右端点,\(r\) 不断扩展,每扩展一次,都把 \(l\) 再移回来,复杂度显然正确。
dsu on tree:
前置知识:按秩合并。
按秩合并应用于并查集,考虑不使用路径压缩,将小集合往大集合合并,总复杂度 \(O(n\log_n)\)(还不太会证!)。
然后就让我们来看一下这个人类智慧算法!!
例题:CF600E Lomsat gelral
特别神奇!发明人受我一拜/bx!
定义 \(i\) 的重儿子 \(x\) 是 \(i\) 的儿子中,最大的儿子,其余的为轻儿子,连接轻儿子的边叫做轻边,那么容易证明,对于任一点 \(i\),他到根节点的轻边条数是 \(\log_n\)的。
然后讲做法,简单描述就是先递归轻儿子,统计答案但不计算对当前点的贡献。再递归重儿子,统计答案并计算对当前点贡献。再递归轻儿子,统计轻儿子对当前点的贡献。
复杂度证明:考虑一个点啥时候会被暴力算,显然是一个轻儿子的后代,既然轻边个数是log的,那么他就最多被覆盖log次,那么 \(n\) 个点,复杂度得证。
- CF741D
首先,我们讲每个字符表示为 \(2^x\),一条路径的权值为亦或和,那么若 \(ans\) 可以表示为 \(2^x\) 形式,即为合法,同时,亦或和最多 \(2^{22}\) 种。
考虑设 \(f_i\) 表示当前子树内的亦或和为 \(i\) 的最长路径长度,那么做法很显然。复杂度是1个log,带22倍常数,跑的很快。
笛卡尔树:大概理解了,但是不知道到底有没有理解/yun
点分治:先咕咕咕。
例题!:
-
P2824 [HEOI2016/TJOI2016]排序
经典套路,二分,然后变成 01 排序,这是俩log。
一个log考虑set维护区间连续段,不会!
考虑加强版:多次询问多个位置。 -
题意简述:给定一个序列,若干询问,每次给定 \(l,r\),要求询问 \(\prod_{l\leq i<j\leq r}\gcd(a_i,a_j) \mod 998244353\)。
数据范围:值域1e5,n,q=1e5。
本文来自博客园,作者:zjrqwq,转载请注明原文链接:https://www.cnblogs.com/zjrqwq/articles/15755032.html