乱七八糟的算法复习

笛卡尔树

一棵二叉树,结构上满足左子树的下标小于自己和右子树,右子树的下标大于自己和左子树。且键值满足堆的限制。

栈构建。维护当前根节点向右一直跳的右链,那么按数组下标顺序插入,每次插入,从栈顶一个个考虑,如果当前的节点的键值不配当他的父亲,那么就弹栈并继续,如果栈空或者找到一个可以当他的父亲的节点,将这个节点的右子树设成当前点的左子树,并将当前点的父亲设为这个节点。

KMP

\(f_i\) 表示最大的 \(S_{1,f_i}=S_{i-f_i+1,i}\)。匹配别人和自己都是类似的跳 f。

manacher

首先构建上在第一个位置插入奇怪字符,其余相邻字母间和第一个字母前、最后一个字母后插入一个相同的另外特殊字符

\(f_i\) 表示以 \(i\) 为回文中心的最长回文串,维护 \(mid,r\) 表示当前回文串最靠右的能达到 \(r\),其回文中心是 \(mid\),那么每次考虑新位置只需设初值为 \(\min(f_{mid + mid-i},r-i+1)\),然后暴力扩展即可。

欧拉路径/回路

经过所有边恰好一次的路径/回路。

有向图存在欧拉回路的充要条件的图联通,且所有点满足入度等于出度。路径就是一个点入度比出度大一,就是终点,另一个点出度比入度大一,就是起点。

无向图存在欧拉回路就是所有点度数为偶数,路径就是有且只有两个点度数为奇数,就是起点和终点。

遇到一些有关度数的题可以往这方面考虑。

求法的话,直接从起点开始搜索,并将搜到的边删掉(无向图则双向都删)即可。过程中,要求经过点顺序的话是搜完有关这个点的边再丢栈里,边就是搜完边再丢栈里,答案就是栈顶到栈底。

子集卷积

\(c_i=\sum_{j|k=i,j\&k=0} a_j b_k\)。设 \(ppc(i)\)\(i\) 二进制下的 \(popcount\)

考虑转成或卷积,就是 \(c_i=\sum_{j|k=i,ppc(j)+ppc(k)=ppc(i)}a_jb_k\)

那么扩展到二维,设 \(X_{i,j}\) 表示 \(ppc(*)=j\) 的序列,则变成了:

\[c_{i,b}=\sum_{c+d=b}\sum_{j|k=i}a_{j,c}b_{k,d} \]

那么后面那个就是或卷积,用 FWT 解决,前面那个枚举一下 \(c,d\) 即可。

复杂度 \(O(n^2 2^n)\)

最小斯坦纳树

实际上主要借鉴的是这种思路而不是这种问题。

考虑设 \(f_{i,S}\) 表示以 \(i\) 为根,连通了 \(S\) 集合内的点的树的最小花费。

那么转移有两种,一种是直接从以 \(j\) 为根,接到 \(i\) 上来,那么这时转移是 \(f_{j,S}+w(i,j)\rightarrow f_{i,S}\)

一种是 \(i\) 的两部分子树合并而来,转移即 \(f_{i,S}+f_{i,T}\rightarrow f_{i,S|T}\)

核心想法在于设一个根,对于一些奇奇怪怪的最小化问题可能有奇效。

线段树合并/分裂

线段树合并,对于两棵动态开点线段树进行合并,做法是先递归目前两个点的左儿子合并,再递归右儿子合并,最后 pushup,当目前递归的两个点只有不超过一个存在时,不必继续递归。

复杂度在多数时候是 \(O(m \log m)\) 的,其中 \(m\) 是线段树被删除的叶子数,\(m\log m\) 即被删除的节点总数。

可以用来优化 dp。优化的往往是树形 dp(常形如 \(f_{u,i}\) 表示 \(u\) 为根子树内信息是 \(i\) 的贡献),且满足子树内只有 \(O(size)\) 个有用的 \(f\) 位置。

当信息比较特殊时就可以线段树合并。例如 NOI2020 命运。转移形如 \(f_{x,i}=f'_{x,i}\times (sum_{v,d_x-1}+sum_{v,i})+f_{v,i}\times (sum_{x,i-1})\)

首先 \(sum_{v,d_x}\) 是固定的,可以事先在 \(v\) 的线段树上查出来。

线段树合并时,如果合并的节点 \(x\) 为空,\(v\) 有数,那么直接将这个节点整个乘上 \(sum_{x,i}\),如果 \(x\) 有数,\(v\) 为空,那么乘上 \(sum_{v,d_x}+sum_{v,i}\) 即可(均为打区间乘标记)注意顺带维护 \(sum_{x,i},sum_{v,d_x}+sum_{v,i}\)。然后对于两个都有值的,如果不是叶子,就按先左后右的顺序递归即可。

如果是叶子,那么直接按柿子转移即可。

线段树分裂也是类似的,你递归分裂 \(x\),如果 \(x\) 的左子树超过 \(k\) 个,就将右儿子划归 \(y\),递归划分左子树,否则左子树不变,递归划分右子树即可。

posted @ 2023-03-23 19:40  infinities  阅读(12)  评论(0编辑  收藏  举报