Trick 积累和易错

积累 Tricks。

  • 常见的贡献问题

    • 贡献之和考虑转换方式求贡献 / 对于小范围问题类似 dp 的方式求贡献。

    • 贡献最大转换成考虑能否在有限步骤内完成使得贡献最大。

    • 有限操作次数、贡献最小考虑均摊及调整法。

  • P1306 对于斐波那契数列 \(f\)\(\gcd{f_n,f_m} = f_{gcd(n,m)}\)

  • 对于 \(\sum\limits_{i=1}^{n}{\sum\limits_{j=1}^{m}{\gcd(i,j)}}\),记 \(f_i = \sum\limits_{i=1}^{n}{\sum\limits_{j=1}^{m}{d \mid \gcd(i,j)}}\) 的个数,\(g_i = \sum\limits_{i=1}^{n}{\sum\limits_{j=1}^{m}{\gcd(i,j) = d}}\) 的个数,则原式 \(= f_i - \sum\limits_{k=1}^{\lfloor{\frac{n}{i}}\rfloor}{g_{ki}}\)

  • CF1706E 对于区间 \([l,r]\) 内点的 lca,其等价于区间内 \(dfn\) 最大最小两点的 lca。

  • 求合法的括号序列可以赋值 (\(1\))\(-1\),对于前缀和 \(pre_i = pre_j\)\([i,j]\) 是合法括号序列的必要不充分条件,如果出现 ))(( 则不合法,此时就需要判是否有 \(pre_i < pre_{i+1}\)\(pre_i < pre_{i-1}\) 的情况,这样是不合法的,可以线段树维护 \(pre_i\) 最后出现的位置 \(lst\),那么 \(lst\) 前面的都不可取。

  • 对于一个给定数组 \(a\),以及未给定的 \(m,k\),如果 \(a\) 满足 \(\forall a_i \bmod m = k\),那么 \(a\) 的差分数组 \(d\) 一定满足 \(\forall d_i,m\mid d_i\)

  • 对于树上最大独立集问题,考虑 \(f_{u,0/1}\) 表示不选或选当前点,那么有 \(f_{u,0} \leftarrow \sum\limits_{v\in son_u}{f_{v,1}},f_{u,1} \leftarrow \sum\limits_{v\in son_u}{\max(f_{v,0},f_{v,1})}\)

  • 分割集合成两个不重集合时可以考虑状压的思想。

  • 对于某些区间满足条件求答案的问题考虑 \(f_i\) 表示以 \(i\) 结尾的计数等,可以考虑暴力方程后树形数据结构维护 / 斜率优化。

  • 遇到两个不定条件其中一个较好做时,考虑固定另一个条件去做好做的,再考虑如何维护不定情况下另一个条件。

  • 查询 AC 自动机中的字符串在给定文本串中出现几次的问题,转化成 \(fail\) 树上子树和问题,通常树状数组或者线段树维护。

  • 复制一遍字符串 \(S\) 并向其插入一个字符,那么左右半边一定有一半是原串 \(S\)

  • 冒泡排序的本质就是对于 \(a_x\) 找到序列中 \(a_x\) 之前有多少个比它大的数的个数 \(y\),那么 \(k\) 次冒泡过后 \(a_x\) 所在位置分成两种情况:

    • 如果 \(y \geq k\),那么最后 \(a_x\) 会出现在 \(a_{x-y}\) 的位置上。
    • 如果 \(y < k\),那么 \(a_x\) 在剩余的位置一定是按照单增的顺序排的。
    • 这样可以树状数组或线段树维护。
  • 求子串可以枚举前缀然后考虑这段前缀的后缀。

  • 子矩阵加可以用扫描线拆分成四个区间加。

  • 遇到逆序对问题可以考虑将 \((i,a_i)\) 放到坐标系上。

  • 对于 AC 自动机上一个模式串的前缀,在 fail 树上从根到该点的路径即为其所有子串。

  • 对于划分集合包含一段连续整数的问题,分界点一定是 \(x \in S\)\((x+1) \not\in S\)

  • 线段树区间查或修记得判 \(ql > qr\) 不合法的情况。

  • 期望 dp 一定是倒着推,状态需要是知道后面才向前转移,一般是“剩余”之类的状态定义。

  • 找到最小的 \(k\) 使得存在 \(s\) 满足 \(\forall i \in [1,n],a_i \bmod k = s\),结论就是差值的 \(\gcd\)

  • 平面图最小割 \(\leftrightarrow\) 对偶图最短路。

  • 最大流结果 \(\leftrightarrow\) 最小割结果

  • memset -0x3f 不等价与 -0x3f3f3f3f3f3f3f3f 而是 ~0x3f3f3f3f3f3f3f3f

  • 区间问题最好都判一下 \(L>R\)swap

  • 网络流通常可以处理限制类问题。(限制类问题可以想想网络流)

  • 最大流输出方案的问题直接判反向边有没有值,有的话说明该边有流量过即输出。

  • \(1 \sim n\) 的约数个数大约是 \(n\log n\) 级别。

  • \(1 \sim n\) 的素数个数大约是 \(\frac{n}{\log n}\) 级别。

  • \(\{a_1 + y, a_2 + y, \dots ,a_n + y\}\) 的这样一个集合,对于任意的 \(\gcd(a_i + y,a_j+y) = x\) 一定满足 \(x\mid (a_i - a_j)\)

  • 对于求不满足 \(ax + by = N(x,y\geq 0)\) 且有解的最大 \(N\),有 \(N = (a - 1)(b - 1) - 1\)

    • 拓展:对于 \(n \in [0,N]\)\(n\)\(N - n\) 中一定有一个可以被表示成如上 \(ax + by = c(x,y\geq 0)\) 的形式且有解
  • 子树内选点问题可以考虑一条边被经过后产生的贡献。

  • 单调不增 / 不降的 \(n\) 项序列且值域 \([0,m]\) 的序列数为 \(\binom{n+m}{m}\)

  • 对于 \(k \leq n\),总会存在一段连续子段 \([l, r]\) 使得 \(sum_{[l,r]} \bmod k = 0\)

  • 遇到图论建模(网络流等)一定要算一算总共加多少边再开数组。

  • 对于字符串循环节,长度为 \(len\) 的一段前缀的最短循环节为 \(len - nxt_{len}\)(kmp 的 next 指针)。

  • 对于经典的相邻不同色的染色问题(\(n\) 个空 \(m\) 种颜色),对于链的方案数为 \(m \times (m - 1)^{n - 1}\),对于环有 \((m-1)^n + (-1)^n(m-1)\)

  • 点数 - 边数 = 联通块数

  • 对于奇素数 p,模 p 意义下二次剩余和二次非剩余均有 \(\frac{p - 1}{2}\) 个。

posted @ 2025-04-07 15:59  xAlec  阅读(280)  评论(1)    收藏  举报