Trick 集合

Trick 集合

1. 基础

  • 判断是否 \(\forall i\)\(x < a_i\)

  • 括号序列:

    • 是括号序列的条件:

      • 总共的左括号和右括号数量相等;
      • 任意前缀的左括号数量 \(\ge\) 右括号数量。
    • 若将序列中左括号看作 \(1\),右括号看作 \(-1\),则两个条件变成了:

      • 总和为 \(0\)
      • 任意前缀和 \(\ge 0\)
    • ABC223F & 题解

  • 求有多少区间和为 \(0\)

    • \(s_i = \sum_{j = 1}^i a_j\),那么区间 \([l, r]\) 和为 \(0\)\(s_r - s_{l - 1} = 0\),也即 \(s_r = s_{l - 1}\)。找满足这样的数对即可。
  • 有多少区间和是 \(k\) 的倍数:

    • \(s_i = \sum_{j = 1}^i a_j\),那么区间 \([l, r]\)\(k\) 的倍数即 \((s_r - s_{l - 1}) \bmod k = 0\),也即 \(s_r \equiv s_{l - 1} \pmod k\)。再令 \(t_i = s_i \bmod k\),然后找有多少 \(t\) 相同的数对即可。

    • AT_abc105_d

  • 给定 \(\{a\}, \{b\}\),求有多少区间 \([l, r]\) 满足 \(\sum_{i = l}^r a_i = \sum_{i = l}^r b_i\)

    • \(c_i = a_i - b_i\),条件变成了 \(\sum_{i = l}^r c_i = 0\)。然后就是上一个的问题。

    • P10033

  • 判断一个字符串中是否存在回文子串:

    • 如果存在 \(s_i = s_{i + 1}\)\(s_i = s_{i + 2}\) 即存在回文子串。否则没有。
    • P3413

2. DP

  • 转移成环:

  • 状态优化:

    • 状态的定义域极其庞大但是值域较小时,可以尝试将状态和值交换。
    • AT_dp_eP3146 & 3147

3. 图论

  • 无向边定向
    • 一个 dcc 一定存在至少一种为无向边定向的方案使其成为 scc。
    • CF118ECF732F

4. 树

  • 树上 \(k\) 级祖先。

5. 数据结构

6. 数学

  • 杨辉三角:

  • \(\gcd\),当一个数 \(a_x\) 是所有 \(a_i(a_x \in \{a_i\})\) 的约数时:

  • 方差:

    • \(\dfrac 1n \sum_{i = 1}^n(x_i - \bar x)^2 = \dfrac 1n( \sum_{i = 1}^n x_i^2) - \bar x^2\)

    • AT_abc332_e & 题解

  • 预处理 \(i^k\)

  • \(x_1, x_2, \dots, x_k\) 的平均值为 \(\bar x\),与 \(k\) 无关的转化:

\[\bar x = \dfrac {\sum_{i = 1}^k x_i}{k}\\ \sum_{i = 1}^k x_k = k\bar x\\ \sum_{i = 1}^k (x_k - \bar x) = 0 \]

  • 判断若干个实数乘积是否为整数
    • 统计小数位数总数,和去掉小数点后质因子 \(2, 5\) 的出现次数的较小值。比较即可。
    • P8972

7. 其它算法

  • 字符串 Hash:

    • \(\text{Hash of S} = \sum_{i = 1}^{n}S_i \times c^{n-i}\)

    • \(\text{Hash of S}_{l \sim r} = hs_r - hs_{l - 1} \times c^{r - l + 1}\)

    • 线段树上字符串 Hash:ABC331F & 代码

  • 启发式合并:

    • 将小集合合并到大集合中,如有需要可以直接交换。
    • ABC329F & 题解
posted @ 2024-01-20 16:43  2huk  阅读(26)  评论(0编辑  收藏  举报