记录一些技巧

一半的半平面交

当求半平面交的一半(相当于求一个直线构成的下凸壳或上凸壳)时, 可以把如 $y=kx+b$ 的直线转化成 $(a, b)$ 求凸壳

长剖换根

长链剖分的换根说的是, 你做完长链剖分之后跑换根dp, 那么现在一个点有其长儿子的信息, 短儿子的信息和子树外的信息, 那么直接把所有短儿子都合并到子树外的信息上, 进入一个轻儿子的时候把自己删了, 把重儿子前 $h$ 个加入, 退出的时候撤销, 进入重儿子的时候就用全部的即可.

要求信息可合并, 可删, 且信息量是仅深度相关对.

二项式系数

$$
\sum \binom {n}{i}^2=\binom{2n}{n}
$$

证明考虑 $[x^k] (1+x)^{2k}$

排列

模 $n$ 的环上存在排列 $p_n$ 满足 $i-p_i$ 互不相同当且仅当 $n$ 为奇数.

必要性显然.

充分性考虑率 $\sum_i i=\sum_i i-p_i=\sum i-\sum p_i=0$ 即可.

末尾添加删除节点的线段树动态构建

UOJ191

Bitset字符串匹配

抄写 alexwei

对 $s$ 和多个模式串 $t$ 求 $t$ 在 $s$ 中出现位置, 对 $s$ 维护字符集个 bitset $b_c$ 表示字符 $c$ 的出现位置, 遍历 $t$ 中的每个字符 $t_i$, 那么如果 $t$ 要在 $x$ 处结尾则 $x-\vert t\vert+i$ 位置应该是字符 $t_i$, 于是把每个 $b_{t_i}$ 左移对应位与起来即可. 复杂度是 $\dfrac{\vert s\vert \vert \sum t\vert}{w}$

为了遍历结束位置, 可以用bitset的 _Find_first()_Find_next(int x) 函数

奇怪卷积

给定集合的序列 $f, g$, 要求 $h_S=\sum_T f_Sg_T2^{S\cap T}$

考虑经典容斥 $2^{\vert S\vert}=\sum_{T\subseteq S} 1$, 有

$$
\begin{gathered}
h_S=f_S\sum_T g_T\sum_{A\subseteq S, A\subseteq T}1\
=f_S\sum_{A\subseteq S} \sum_{T\supseteq A} g_S
\end{gathered}
$$

发现是对 $g$ 先做高维后缀和再做高维前缀和.