tricks

随时更新。

也叫 Tricks

  • \(\{1,0,0,\ldots\}\)\(k\) 次前缀和,下标从 0 开始,则 \(a_d\)\(C_{d+k-1}^{k-1}=C_{d+k-1}^d\)
    证明:杨辉三角
  • 对于算这种 \(\displaystyle\sum_{i\in[l_k..r_k]}\left\lceil\dfrac{a_i}{f_k(i)}\right\rceil\),以上取整为例,记值域为 \(A\),多组询问,可以这样:
  • \(l_k=1,r_k=n\)
  • \(A\) 较小,\(f_k(i)\)\(i\) 无关,对每个 \(a_i\) 都整除分块,找到当 \(x\to x+1\)\(\left\lceil\dfrac{a_i}x\right\rceil\) 的变化值,累加到一个数组里,这样可以对于多组询问,想个方法扫一遍 / 事先做个前缀和 什么的,预处理 \(O(n\sqrt A)\)
  • \(f_k(i)\)\(i\) 无关,从大到小对 \(a_i\) 排序,定义一个 \(q\),对 \(i\in[1..q]\),暴力算;对 \(i\in[q+1..n]\),由于答案最多 \(\dfrac{a_{q+1}}x\) 种,我们对每个取值二分边界,然后令 \(q\) 为最后一个满足 \(a_q\ge\dfrac{qf_k}{\log n}\) 的位置,每次询问 \(O(q)\).
  • \(f_k(i)\) 可以通过处理(如离线)使其有关于 \(k\) 的单调性(这里是单增),设定常数 \(M=\sqrt{A\log n}\),对每个询问,我们先暴力做前 \(M\) 个,然后推出剩下的每个答案最多 \(\frac AM\),对每个 \(a_i\) 和每个 \(j\in\left[1..\frac AM\right]\),二分找到让 \(a_i\) 的答案至少为 \(j\) 的可能的最左询问左端点 \(l_i\),在 \(l_i\) 位置记录 \(a_i\) 答案的增加值;然后按左端点对询问排序,扫描线,用一个支持单点加、区间和的数据结构(BIT)维护每个 \(a_i\) 的答案,移动左端点的时候就多次单点加,回答查询时就区间查,预处理 \(O\left(n\frac AM\log n\right)\),每次查询 \(O(M+\log n)\),取 \(M=\sqrt{A\log n}\) 得到 \(O((n+q)\sqrt{A\log n})\).
  • 如何判树上两个点有祖先关系?利用 dfn 序:一个点的子树在 \(\text{dfn}(u)\sim\text{dfn}(u)+\text{siz}(u)-1\) 里面,只需要看另一个点是否在这个区间内即可.
  • \(\{a_1,..,a_n\},\{b_1,..,b_m\}\),一次可以让 \(a_i\gets b_{a_i}\)\(a_i,b_i\in[1..m]\),那么连边 \(u\to b_u\),连出来一定是内向基环树森林,一次操作相当于让 \(a_i\) 往后走一步
  • 对于有一些限制条件形如 \(a_1<a_2<a_3>a_4>a_5<a_6<a_7>a_8<a_9\),可以把 \(>\) 容斥成"没有限制"和 \(\le\),一种方案的容斥系数就是 \((-1)^{cnt}\),其中 \(cnt\) 表示有多少个 \(\le\).
  • 对于由若干互不影响的部分组成的答案,形式化的,\(\displaystyle c(n)=\sum_{k=0}^{\infty}\sum_{n_i\ge0\land n_1+\ldots+n_k=n}a(n_1)a(n_2)\ldots a(n_k)\),注意到它是一个卷积,我们令 \(\displaystyle A(x)=\sum_{n\ge0}a(n)x^n,C(x)=\sum_{n\ge0}c(n)x^n\),有 \(\displaystyle C=\sum_{k=0}^{\infty}A^k=\dfrac1{1-A}\),我们求个逆可以 \(O(n\log n)\).
    其中 \(\displaystyle\because C=\sum_{k=0}^{\infty}A^k,\therefore AC+1=C,\therefore C=\dfrac1{1-A}\).
  • 一种 dp 思路:
    你一定可以通过如下两个操作唯一的凑出一个单调不减的序列:
  • 在序列的最前面加入这个序列的值域最小取值
  • 整个序列加一
    我们按这样转移 dp,转移是 \(O(1)\) 的,可以用来数一些单调不减且总和一定的序列什么的
    这个思路最开始是在整数划分数出现的.
  • 对于 \(0\sim n-1\) 的排列,你选出任意一个子序列,它的 mex 等于其余元素的 min.
  • 一棵有根树,除去 \(u\to v\) 路径上所有点,剩下的点可以用这棵树的前序遍历 + 后序遍历两个序列上的共 \(5\) 个区间恰好包含.
    定义:对于一棵不是二叉树的树,你 dfs 它一遍,记前序遍历数组为 \(\text{in}\)、后序遍历数组为 \(\text{out}\),你每进一个点就把这个点加入到 \(\text{in}\),每出一个点就把这个点加入到 \(\text{out}\),同时记录这个点在 \(\text{in},\text{out}\) 中的位置 \(\text{tin},\text{tout}\);记 \(u,v\) 的 lca 为 \(l\)\(l\)\(v\) 方向的第一个点为 \(m\),设 \(\text{tin}_u<\text{tin}_v\),对每个点记录 \(\text{mtout},\text{mtin}\) 分别表示它子树的 \(\text{tout}\) 最小值、\(\text{tin}\) 最大值;
    我们把剩下的点 \(p\) 分成五类:
    1. \(\text{tout}_p<\text{tout}_u\)
    2. \(\text{tin}_u<\text{tin}_p<\text{tin}_m\)
    3. \(\text{mtout}_m\le\text{tout}_p<\text{tout}_v\)
    4. \(\text{mtin}_v<\text{tin}_p\le\text{mtin}_l\)
    5. \(\text{tout}_l<\text{tout}_p\)
      然后做完了.
  • 需要支持以下操作:
    1. \(u\)\(root\) 的链整体加 \(val\)
    2. 单点问 \(v\) 的权值
      可以转化为 \(u\) 单点加 \(val\)\(v\) 查子树和,可以用树状数组解决。
  • AC 自动机既可以处理“前缀”关系也可以处理“后缀”关系,前缀关系通过 trie 来维护,后缀关系通过 fail 树来维护;前后缀关系可以通过 把串反过来 来互相转化。
posted @ 2024-09-09 07:39  Laijinyi  阅读(3)  评论(0编辑  收藏  举报