Tricks(持续更新)

这里我的学习OI思路转变其实和_Famiglistimo是一致的

从罗列算法(如DFS、DP、图论)的“知识库”模式转向提炼解思维模式(Tricks)的“工具箱”模式

  • 旧思路(算法驱动):“我学到了什么算法?” -> “什么问题能用这个算法解决?”
  • 新思路(技巧驱动):“我遇到了什么特征的问题?” -> “什么样的思维模式或技巧最适合解决它?”

这里只是整合了一些内容便于阅读

若有问题和补充一定要指出!!!本人感激不尽!!!

当然催更也行...


第一篇

https://www.luogu.me/article/cqhi72t6

📝 符号说明

文章中使用了一些特殊符号表示法:

符号 含义
x ←[op] y 等价于 x ← x op y,如 x ←[+] yx ← x + y
(a₁,a₂,...,aₙ) < (b₁,b₂,...,bₙ) 按字典序比较
dinᵢ 节点 i 的入度
doutᵢ 节点 i 的出度
u ↝ v uv 的一条路径
u —[w]→ v uv 的有向边,权值为 w
u ←[w]→ v 连接 uv 的无向边,权值为 w
u ←[a]—[b]→ v 等价于 u →[a] vv →[b] u

📚 1. GCD 的 log 性质 ★

核心思想

一个数最多经过 O(log V) 次改变其值的 GCD 操作(V 为值域)。这使得我们可以将对整个序列的考虑转化为对数级别块的枚举。

应用场景

  • 处理子段 GCD 查询问题
  • 涉及区间 GCD 修改的问题

例题解析

例 1.1 HDU 5869. Different GCD Subarray Query

题意:给定长度为 n 的正整数序列 a,进行 q 次查询,每次查询区间 [l, r] 内所有子段的不同 GCD 个数。

数据范围1 ≤ n, q ≤ 1e51 ≤ a_i ≤ 1e6

思路

  1. 固定左端点 l,向右扩展右端点 r 时,不同的 gcd(a[l...r]) 只有 O(log V)
  2. 预处理出所有可能的 GCD 块
  3. 离线查询,用 BIT 维护

时间复杂度O(n log n log V)

例 1.2 QOJ 9426. Relearn through Review

题意:给定长度为 n 的正整数序列,最多可以选择一个区间 [l, r] 整体加上 k,最大化整个序列的 GCD。

数据范围1 ≤ n ≤ 3e51 ≤ k, a_i ≤ 1e18

思路

  1. 考虑前缀 GCD 的单调不升性质,将其划分为若干块
  2. 每块只需考虑对块首进行枚举计算
  3. 块数为 O(log n) 级别

时间复杂度O(n log² n)

🔁 2. 奇偶位反转技巧 ★☆

核心思想

当需要对 01 字符串进行相邻相同字符操作时(如翻转 AABB),可以考虑对所有偶数位(或奇数位)取反,将操作转化为相邻不同字符的操作(如交换 AB),从而简化问题。

应用场景

  • 字符串相邻字符翻转问题
  • 涉及对称性操作的字符串问题

例题解析

例 2.1 Atcoder TKPPC6-2 B. Replace to Order

题意:给定由 AB 组成的字符串 ST,每次操作可以选择一个 AABB 子串翻转为 BBAA,求从 S 变到 T 的最小操作次数。

数据范围2 ≤ n ≤ 2e5

思路

  1. 翻转偶数位后,操作变为交换相邻的 ABBA
  2. 问题转化为通过交换相邻相异字符使字符串匹配
  3. 贪心考虑每个 A 的相对位置变化

时间复杂度O(n)

例 2.2 QOJ 9565. Birthday Gift

题意:给定由 012 组成的字符串,可以进行两种操作:① 将 2 改为 01;② 删除子串 0011。最小化最终字符串长度。

数据范围1 ≤ n ≤ 2e5

思路

  1. 翻转偶数位,删除操作变为删除 0110
  2. 最终字符串必为全 0 或全 1
  3. 设原字符串中 012 的个数为 c₀c₁c₂
  4. 删除操作不改变 |c₀ - c₁|,根据 c₂|c₀ - c₁| 的关系讨论

时间复杂度O(n)

🚀 3. 倍增 Floyd ★★

核心思想

当 Floyd 算法中的运算(min+)满足结合律时,可以将转移看作矩阵乘法,用矩阵快速幂加速。这适用于需要恰好经过 k 条边的路径问题。

应用场景

  • 恰好经过 k 条边的最短路问题
  • 具有结合律的图论递推问题

例题解析

例 3.1 Luogu P2886. Cow Relays G

题意:给定 n 个点 m 条边的无向带权图,求从 st 恰好经过 k 条边的最短路。

数据范围1 ≤ k ≤ 1e61 ≤ m ≤ 1001 ≤ n ≤ 200

思路

  1. 将 Floyd 转移写作矩阵形式:f'[i][j] = min(f'[i][j], f[i][k] + f[k][j])
  2. k 次转移等价于经过 k 条边
  3. 使用矩阵快速幂加速

时间复杂度O(n³ log k)

例 3.2 Luogu P6190. 魔法

题意:给定 n 个点 m 条边的有向带权图,从 1n,最多可以使用 k 次魔法,每次魔法可使某条边的权值取负,求最短路。

数据范围1 ≤ n ≤ 1001 ≤ m ≤ 25001 ≤ k ≤ 1e6

思路

  1. k=0 时直接 Floyd
  2. k=1 时,枚举边 (u, v, w),转移为:f[i][j] = min(f[i][j], f[i][u] + f[v][j] - w)
  3. k>1 时,将 k=1 的转移矩阵做 k 次幂(矩阵快速幂)

时间复杂度O(n³ log k)

🔗 4. 倍增优化并查集 ★★★

核心思想

当需要合并两个区间内的所有元素时,由于并查集的合并操作满足结合律,可以类似 ST 表进行倍增优化:将区间拆分为 2^k 长度的块进行合并,最后再下传信息。

应用场景

  • 区间元素批量合并问题
  • 需要高效处理大量区间等价关系的问题

例题解析

例 4.1 Luogu P3295. 萌萌哒

题意:一个长度为 n 的正整数 S,有 m 个要求:S[l₁:r₁] = S[l₂:r₂],求满足所有要求的不同的 S 的数量。

数据范围1 ≤ n ≤ 1e51 ≤ m ≤ 1e5r₁-l₁ = r₂-l₂

思路

  1. 建立 log n 个并查集,第 jfa[i][j] 表示区间 [i, i+2^j-1] 的代表
  2. 将每个要求拆分为两个 2^k 长度的区间进行合并
  3. 从上到下传递信息:将大区间的关系拆分为两个小区间
  4. 统计最底层连通块数量 c,第一位不能为 0,答案为 9 × 10^(c-1)

时间复杂度O(n log n α(n))

🌳 5. 图转生成树 ★☆

核心思想

当在无向图上的操作或查询难以处理时,可以考虑在其生成树(或生成森林) 上进行。树的结构更简单,便于应用树形 DP、贪心等算法。

应用场景

  • 图上的删点/删边问题
  • 需要简化图结构进行分析的问题

例题解析

例 5.1 Luogu P4494. 反色游戏

题意:给定 n 个点 m 条边的无向图,节点有黑白两色。每次操作选择一条边,将其两端点颜色反转。对于每个点 i,求删去点 i 及其关联边后,能使所有节点变白的操作方案数。

数据范围1 ≤ n, m ≤ 1e5,无重边自环

思路

  1. 不删点的情况

    • 操作不改变黑色节点数量的奇偶性
    • 连通块内黑色节点数为奇数则无解
    • 在生成树上从叶子向上贪心,方案数为 2^(m-n+c)(c 为连通块数)
  2. 删点的情况

    • 孤立点:直接判断
    • 割点:判断所有新连通块的黑点奇偶性
    • 非割点:判断所在连通块的变化

时间复杂度O(n)

例 5.2 Luogu P11360. 管道

题意:给定 nm 边的图,求每个极大连通子图内的所有桥。

数据范围1 ≤ n ≤ 1e51 ≤ m ≤ 6e6内存限制 16 MB

思路

  1. 正常 tarjan 算法内存不足
  2. 在生成树中,桥是未被非树边覆盖的树边
  3. 在生成树上做路径覆盖(树上差分)
  4. 非树边不会构成环,因此只需保留 O(n) 条关键边

时间复杂度O(m α(n) + n log n)

🕸️ 6. 图上连边二元组 ★☆

核心思想

将题目中给出的二元组关系 (a, b) 视为图中的一条边,通过分析图的属性(如连通性、生成树)来解决问题。

应用场景

  • 约束条件满足性问题
  • 区间操作转单点操作的问题

例题解析

例 6.1 ABC155 F. Perils in Parallel

题意:有 n 个位于位置 a_i、状态为 b_i ∈ {0,1} 的灯,m 个开关,第 i 个开关反转区间 [l_i, r_i] 内所有灯的状态。构造方案使所有灯状态为 0

数据范围1 ≤ n ≤ 1e51 ≤ m ≤ 2e5

思路

  1. b_i 进行异或差分,区间操作变为单点操作
  2. 连边 (l_i, r_i),操作变为选择一条边,反转其两端点状态
  3. 在生成森林上从叶子向上贪心

时间复杂度O(n)

例 6.2 CF1815C. Between

题意:给定 nmm 个二元组 (a_i, b_i),构造最长序列 p,要求:① 有恰好一个 p_i = 1;② 对于每个二元组,任意两个 a_i 之间必须至少有一个 b_i

数据范围1 ≤ n ≤ 15001 ≤ m ≤ 3000

思路

  1. c_i 为数字 i 的出现次数
  2. 对每个二元组 (x, y),有约束 c_x ≤ c_y + 1
  3. 连边 b_i → a_i,权值为 1
  4. BFS 求出每个 c_i 的最大值
  5. 按照特定模式构造序列

时间复杂度O(nm)


第二篇

https://www.luogu.com.cn/article/krybn2f5

📌 核心解题思想

1. 问题转化与简化

  • 序列分治:序列问题难以直接解决时,尝试分治思想。
  • 状态细化:计数问题的核心是通过强制细化状态或增加维度来实现不重不漏。
  • 规约模型:数据结构的精髓是将问题规约到已有模型,本质是合并重复信息。
  • 降维打击:无法动态查询时,离线后动态维护当前状态;多组询问常通过离线维护信息来降维。

2. 顺序与方向

  • 顺序影响:优先考虑操作顺序对答案的影响。若无影响,可使用带修莫队、撤销DP等。
  • 反向思维:有向图正图难做时,考虑建立反图。
  • 时间倒流:只允许尾部撤销的操作,可用线段树分治维护。

3. 优化与搜索策略

  • 状态优化:写DP前首先考虑优化状态设计。
  • 搜索剪枝:当状态数不多时,尝试直接搜索。
  • 二分答案:当要求一个最优状态,且劣状态可由优状态到达时,尝试使用二分。

🔧 实用技巧分类

数据结构技巧

  • 根号分治:小段暴力处理,大段打标记维护。
  • bitset优化
    • 用于求传递闭包。
    • 优化01背包合法性判断并记录状态(参考CF356D)。
  • 区间操作:给定若干区间,去除被完全包含的区间后,按左端点排序,右端点也是升序。
  • 离散化优化:块内离散化效率严重依赖内存访问连续性。
  • 子树信息:DFN序的中位数一定在树重心的子树内。
  • 连通块计算:连通块数 = 点数 - 边数。

图论相关技巧

  • 树上路径:树上路径问题常可拆分为深度差相关的问题。
  • 最小连通子图:树上一个点集的最小连通子图,是其按DFN序排序后,相邻点距离之和(参考CF372D)。
  • 环上问题:图的问题若环内贡献可简单求出,考虑缩点。
  • DAG性质:DAG拓扑排序中,任意时刻队列里的点都不可互相到达(参考CF1062F)。
  • DFS树性质:无向图的DFS树不存在横叉边。
  • 随机化应用:题面未规定根时,可随机选根以避免被卡。

动态规划优化

  • 计数DP:树上计数DP,若状态f[u]表示子树内答案且所求为连通块,则令f[u]的答案强制包含uu到父亲强制不选。
  • 期望DP:期望题有时可不解方程,只求出目标值的系数和常数项。
  • 换根DP:换根DP可以使用分治来避免撤销操作。
  • 矩阵加速:直接维护困难但递推关系简单时,可使用矩阵乘法;带撤销则可用线段树维护矩阵乘法。
  • 双栈技巧:用于可合并区间的不带删尺取法。核心是枚举中间点,左右拼区间,处理完后中间点直接跳到右区间。

数学与几何

  • 扫描线思想:最大化一个集合的最小值,可考虑从大到小的类扫描线方法。
  • 射线法:判断点是否在多边形内,可从该点引射线,与多边形边相交奇数次则在内部,偶数次则在外部。方向限定时,区间可视为上开下闭(参考CF375C)。
  • 凸包面积:精度要求较低时,求凸包面积可直接用积分近似(参考CF379E)。
  • 线性基:线性基中,如果某一位是某个基的最高位,则只有那个基的这一位为1;否则任何最高位大于这一位的基,其这一位可为任意数(参考CF388D)。
  • 子集求和:使用高维前缀和(SOS DP)。
  • 组合数区间加:可通过高阶差分转化为单点修改(参考CF407C)。
  • 整数根判定:求多项式整数根时,利用因式定理,只有常数项的因数可能是答案。

字符串与构造

  • 字符串匹配:考虑根号分治策略(参考CF444D)。
  • 一一对应:计数问题转化时,常考虑“一一对应”原则(参考CF40E)。
  • 构造技巧:尝试整体移动并加上同一个变化量(参考CF468C)。
  • 等差数列判定:判断排列是否存在长度为3的等差数列子序列,可转化为求中间位置的数向两边拓展是否形成回文串(参考CF452F)。

高效编码与优化

  • 变量定义:事先定义全局变量通常比多次定义局部变量快。
  • 取模优化
    • 数据比模数大时先取模。
    • 多个n级别的数可先加起来再取模。
    • 矩阵快速幂时注意顺序,并可采用ull暂存、累计多次再取模的策略。
  • 栈优化:用栈模拟递归时,可使用“当前弧”优化。
  • 结构体清空:使用结构体前务必清空。
  • 容器选择unordered_set (uset) 通常远快于 unordered_map (umap)。

🎯 特定问题模式

区间与序列

  • 区间翻转:区间翻转一个排列,最多会引入四个不连续的位置。
  • 区间合并:两部分组合时,考虑枚举中间的分割线。
  • 区间取交:多个区间取交集,结果仍是一个区间,可枚举交集的左端点。
  • 区间树:序列上若干不交错(包含或无交)的区间,可以构成一棵树形结构(参考CF494C)。
  • 括号序列:维护括号序列可以转化为树问题,树也可以转化为括号序列。

图与网络

  • 链修改离线:树上有多次基于原树、一端固定的链修改,可将所有修改离线,从固定端开始DFS,动态插入和撤销维护(参考P3722)。
  • 路径统计:对于A->B->C->D类路径统计,可先预处理A->B->C,再组合A->(B->C)->D(参考CF416E)。
  • 环上最大流:断掉环上边权最小的边,并将剩余环上每条边加上该最小边权,则最大流等于链上最小值。
  • 图上贪心:图上路径最小值类问题,可考虑将边或点排序后,从小到大依次选取(参考CF444E)。
  • 最大匹配贪心:求最大公因数大于1的最大匹配,可从大到小枚举素数,优先匹配其倍数。最后常保留2的倍数,因其出现最多(参考CF449C)。
  • 网格染色:网格图(对角线)染四种颜色,要求每条边连接的两顶点颜色不同。合法方案当且仅当奇数行循环1212,偶数行循环3434。

计数与容斥

  • 组合意义:组合数C(n, k)的组合意义是枚举大小为k的子集(参考CF457D)。
  • 容斥转移:容斥时,一些状态可以由另一些状态通过一一对应的方式转移而来(参考CF348D)。
  • 浮点精度:答案为浮点数时,当x较大,x/2^k类的贡献可以忽略(参考CF380E)。

💎 核心结论与模板

  • 快速幂前提:任何满足结合律的运算都可以用快速幂加速。
  • 整体二分:适用于多种有单调性的问题(参考CF484E)。
  • 树上高斯消元:从叶子向上消元,再从根向下回代,时间复杂度可优化至O(n)O(n log n)
  • 多项式处理Σai^2 = (Σai)^2 - 2ΣΣaiaj
  • 等价转化:通过形式转化(如a/ba*(1/b)),将问题化为相同形式。

第三篇

https://www.cnblogs.com/wyb-sen/p/17234499.html

核心思想:将最优化问题转化为可行性判定问题。

“看到数据范围出 log 了...我们就无脑二分。”

  • 应用:当直接求解最优值困难,但给定一个值后容易判断其是否可行(或优于目标)时使用。
  • 进阶:判定解是否存在有时可理解为计数问题。例:Gym102354B 通过二分将 max 问题转化为 sum 问题。

2. 正难则反 / 时间倒流 (Reverse Thinking)

核心思想:正向操作或思考困难时,尝试逆向过程。

  • 应用场景
    • 操作删除:将“边选边删”倒流为“边出现边选”,更符合贪心逻辑。(例:CCO2017 Professional Network)
    • 维护困难:将离线问题中的删除操作倒序变为添加操作,便于用数据结构维护。(例:WC2006 水管局长)
    • 条件转化:直接统计合法方案困难时,考虑统计非法方案再用总数减去。(例:CF1750F Majority)
  • 要点:很多出题思路源于逆向思考,正解常是逆向过程的模拟。

3. 差分序列 (Difference Array)

核心思想:将区间操作转化为差分序列上的单点操作。

  • 核心优势:极大地简化了区间加、区间修改等问题的维护难度。
  • 关键变化:转化后问题的充要条件可能发生变化,需仔细分析。
    • :ARC136C Circular Addition 中,环形序列区间+1/-1操作转化为差分数组上的+1/-1操作后,答案变为差分性质与原序列最大值的综合分析。
  • 扩展应用
    • 结合前缀和思想处理区间查询。
    • 将形如 max - min 的约束转化为差分序列的约束来构造。
    • 维护“区间修改 + 前缀最大值”问题时,维护差分数组可能更方便。

实用技巧分类

一、 问题转化与构造技巧

  1. 交换枚举顺序
    • 核心:改变循环嵌套顺序,可能带来复杂度优化或模型转化。
  2. 削减问题规模递归处理
    • 核心:将大问题分解为结构相似的子问题递归求解。
    • :Ptz Summer 2022 Day2E Ternary Search。
  3. 邻项交换分析
    • 核心:用于证明贪心策略的正确性,通过分析交换相邻两项对答案的影响。
    • :在排序确定最优顺序时,可通过分析交换相邻两项的代价来推导全序关系。
  4. 上下界调整
    • 核心:如果理论上界和下界之间的所有值都能通过调整策略取得,则问题往往被简化为计算上下界。
    • :ARC125F Tree Degree Subset Sum 中,证明了对于任意可行的度和,其对应的点数可以在一个连续区间内取到,从而消去一维状态。
  5. 11/00 操作 → 对 10 操作
    • 核心:对奇数位或偶数位进行整体反转(如 0110),可以将对相邻相同位的操作转化为对相邻相异位的操作(如交换),大幅简化问题。
    • :CF1615F LEGOndary Grandmaster;AGC040C Neither AB nor BA。
  6. 从出题人角度思考
    • 核心:思考题目限制(如为何只能交换相邻项)背后的原因,这往往是解题的突破口。考虑如果放宽条件,问题是否会变得不可做或过于复杂。

二、 数据结构与算法应用技巧

  1. 01-BFS
    • 核心:边权仅为 01 时,使用双端队列进行 BFS,时间复杂度可降至 O(V+E)
    • 提醒:这是一个简单但易忘的技巧。
  2. 单调栈退栈时转移
    • 核心:在单调栈维护元素弹出时,进行动态规划状态转移,常是满足某种单调性(如最近更大值)的转移。
    • :CF1407D Discrete Centrifugal Jumps。
  3. 虚点 (Virtual Point)
    • 核心:建立虚拟节点来统一处理对某个集合的操作,常用于优化建图。
    • 应用:需要对一个集合所有点连边时,只需向虚点连边。
    • :ABC250Ex 中利用虚点思想辅助建图,再使用 Kruskal 重构树。
  4. 求第 k 大 / 前 k 大方案
    • 第 k 大通用方法:二分答案 mid,转化为统计 ≤ mid 的个数(判定问题)。
    • 前 k 大方案:使用优先队列多路归并。初始将各组最大值入堆,弹出后补充该组下一大值。
    • 核心:将排名问题转化为计数问题。

三、 图论与构造技巧

  1. 构造题基本逻辑
    • 考虑下界:先理论分析答案的下界。
    • 判断无解:尝试找出无解的充要条件。
    • 尝试连边:将元素间关系抽象为图论模型是常用手段。
    • 调整策略:先构建一个可能不优的解,然后通过局部调整逼近最优。
  2. 构造性质图
    • 思路一:强行按照性质要求进行构造。
    • 思路二:如果构造失败,反推性质对图结构的强约束,据此进行构造。
    • 原则:从简单情况入手,逐步规约。

四、 交互题思路

  • 倒推法:假设已知某个关键信息(xxx),则问题可解。然后设计策略去获取这个 xxx
  • 核心:将“如何解决问题”转化为“需要什么信息才能解决问题”。

技巧快速索引表

技巧大类 技巧名称 核心要点 典型应用场景/例题
核心思想 二分答案 最优化 -> 判定性 Gym102354B
正难则反/时间倒流 逆向操作、容斥思考 WC2006水管局长、CCO系列题
差分序列 区间操作转单点操作 ARC136C、CF1500F
问题转化 邻项交换分析 证明贪心顺序、推导全序关系 国王饮水记变体
11/00操作转化 反转奇偶位,变为交换操作 CF1615F、AGC040C
上下界调整 证明取值连续,消去维度 ARC125F
数据结构 01-BFS 双端队列处理0/1边权图 WOJ 4701 Walk
单调栈转移 元素出栈时进行DP转移 CF1407D
虚点 优化建图,统一处理集合操作 ABC250Ex
求第k大 二分答案转判定、多路归并 CF601C、前k大方案通用方法
构造与交互 构造通用逻辑 判下界、连边、调整 AMPPZ2014 The Cave
交互题倒推 确定关键信息需求 各类交互题

第四篇

https://www.cnblogs.com/lsj2009/p/17668670.html

图论技巧

技巧 核心思想 说明与例题
删点起手 对于树或DAG的构造等问题,从叶子节点入度为零的节点开始删点考虑。 一种常见的简化问题起手思路。
倍增Floyd 涉及固定步数的最短路问题,若Floyd的min+运算满足结合律,可用矩阵快速幂加速。 例:求恰好经过 k 条边的最短路。
LCA优化 点集 {u_n} 的LCA,等于其中DFN序最小和最大的两个点的LCA。 可快速计算多点LCA。参考:CF1062E。
网格图建模 当题目对整行、整列有操作时,可将第 i 行与第 j 列连边,权为 a_{i,j},常转化为二分图问题。 特殊地,当 a_{i,j}=i+j 时很常用。参考:ARC083F。
虚树应用 树上问题若只涉及部分关键点(如黑白点),且结构与子树无关时,考虑建立虚树简化结构。 用于优化树上DP或路径查询。
点边权转化 当图既有点权又有边权时,考虑将点权拆到邻边上,或将边权集中到点上处理。 方便统一处理,简化模型。
度数根号分治 当算法复杂度与节点度数相关时(例如枚举邻居),考虑按度数大小分类(根号分治)优化。 参考:P3547(三元环计数)。
路径拆分统计 若要计算节点 u 到所有点 v 的某个信息,可将路径 (u,v) 拆为 (u, lca)(lca, v) 两段,分别汇总和下传。 参考:AtCoder Code Festival 2017 Final J。
竞赛图性质 n 个点的竞赛图,其三元环数量为 C(n,3) - ΣC(deg_i, 2)。竞赛图缩点后形成一条链。 用于竞赛图的计数与结构分析。

其他重要技巧:

  • 01信息建模:遇到奇偶、黑白、男女等二元状态,考虑二分图、并查集或网络流。
  • Boruvka算法:求完全图最小生成树且边权有规律时,考虑此算法。参考:CF888G。
  • 欧拉路:要求某些边至少/恰好走一次,考虑欧拉回路/路径的存在性条件。参考:P6628。

数据结构技巧

技巧 核心思想 说明与例题
树剖边转点 将边 (u,v) 的信息放到深度较深的点 v 上。修改/查询链 (u,v) 时,操作 dfn[u]dfn[v] 的点,并排除 lca(u,v) 将边权问题转化为点权问题处理。
主席树替代树套树 当问题可以离线,或其中一维是可持久化的版本时,主席树(可持久化线段树)可替代树套树。 作用上,主席树 ≈ 不带修的多维线段树。
矩阵维护复杂修改 当区间修改操作复杂但具有线性性时,可尝试用矩阵表示,并用线段树维护矩阵乘(加)。 参考:LOJ2980。
根号分治 当问题中有“出现次数”这类元素时,常可设定阈值,出现次数多的元素种类少、出现少的元素种类多,分别用不同策略处理。 极为重要的复杂度平衡思想。
颜色数转pre数点 统计区间内颜色种类数,常记录每个位置 i 的颜色上一次出现的位置 pre[i],区间颜色数即区间内 pre[i] < li 的个数。 经典莫队或线段树/BIT问题。
线段树分治 当遇到删除操作困难,但操作可逆时,离线后按时间轴建立线段树,将操作存在对应区间,遍历线段树时执行加入与回退。 用于处理可撤销并查集、线性基等。
随机二分 查询第 k 小,若存在 O(k log n) 的检查算法但 k 很大时,可随机二分期望值。 参考:P5984。
轻重儿子信息分离 快速统计某点所有儿子的信息,可用一个数据结构维护所有轻儿子信息,重儿子单独查询或维护。由于树剖跳链次数少,轻儿子修改可接受。 参考:CF1172E, P5314。

动态规划技巧

技巧 核心思想 说明与例题
前后缀分离DP 遇到“禁用某个物品”的询问时,预处理前缀DP后缀DP,回答时合并前后缀信息,避开禁用点。 参考:P1973(强制选)。
数位区间DP 在数位上进行区间DP,而非常规的线性DP,可以处理更复杂的数位间约束关系。 参考:P9129。
状态有用性剪枝 设计DP时,不断思考:哪些状态是真正有用的? 是否可以合并或舍弃一些状态? 优化状态空间的核心。
利用转移单调性 优化DP状态时,若决策点或转移值具有单调性,则可使用单调队列、二分栈等优化。 例如斜率优化、四边形不等式。
卷积与积性 DP转移方程涉及因数/倍数求和时,可写成 Dirichlet 卷积形式,利用积性函数性质和前缀和优化。 可能需要结合莫比乌斯反演。

数学与杂项技巧

技巧 核心思想 说明与例题
哈希判等 需要快速比较集合或序列是否相等/相似时,考虑哈希。动态维护需用可快速更新的哈希函数(如多项式滚动哈希)。 参考:P5278。
维护前后缀 对“删除”困难的操作(如模非质数除法、线性基相减),改为维护前缀后缀信息,查询时合并。 参考:CF543D。
根号分治 既是数据结构思想,也是复杂度分析的重要方法。当参数大小两类行为差异大时,用阈值平衡。 非常高频且重要。
绝对值转化 ` a-b
平均数归零 看到“平均数等于 x”,将所有数减去 x,条件转化为“和为 0”。 参考:ARC104C。
组合数奇偶性 C(n,m) 为奇数当且仅当 (m & n) == m(二进制下 mn 的子集)。 卢卡斯定理推论。
异或性质 popcount(x⊕y) ≡ popcount(x)+popcount(y) (mod 2)。偶数 x 满足 x ⊕ (x+1) = 1 用于奇偶性相关分析。参考:CF1493E。
01序列简化 对于排序、交换类问题,可尝试将所有元素根据与某阈值 x 的关系转化为 01 序列,常能简化问题。 二分答案的配套技巧。
期望线性性 期望 E = Σ p_i * i。可转化为 E = Σ s_i,其中 s_i = Σ_{j=i}^n p_j 是后缀概率和。 参考:CF1523E。
取模周期处理 处理 a mod b 相关问题时,考虑其值以 b 为周期变化,可按周期分组处理。 参考:CF55D, CF1359E。
组合意义转化 遇到奇怪的贡献形式(如 x^k),思考其组合意义(如:x^k 可视为 k 个有序球的方案数)。 将代数问题转化为组合问题。

第五篇

https://www.luogu.me/article/fzxdw3x2

📐 数学与公式技巧

  • 连通块计数:对于任何图,连通块数量 = 点数 - 边数。这是一个用于快速计算连通分量数量的基础公式。
  • 平方和公式
    \((\sum\limits_{i=1}^ka_i)^2=\sum\limits_{i=1}^k\sum\limits_{j=1}^ka_ia_j=\sum\limits_{i=1}^ka_i^2+2\sum\limits_{i=1}^k\sum\limits_{j=i+1}^ka_ia_j\)
    该公式在将和的平方展开计算时非常有用,常见于计数和期望问题。
  • 光速幂优化:预处理一个 O(v√v) 大小的数组 f[i][j] = i^j,即可 O(1) 回答 i^j mod p 的查询。因为 (i^{√v})^j = f[i^{√v}][j] = f[f[i][√v]][j]
  • 绝对值转换|a-b| = 2*max(a, b) - a - b。这个等式在需要消去绝对值或转换最值运算时很有用。
  • 排列与逆序对:一个排列的逆序对数的奇偶性,与 n 减去其置换环个数的奇偶性相同。
  • 方案数平方和:所有类别的方案数的平方和,等价于 “任意取出两个方案,且它们属于同一类别” 的方案数。这是从组合意义出发的经典转化。
  • 最值嵌套简化:求 min{max(a,b)}max{min(a,b)} 时,可以尝试分类讨论掉内层的 maxmin。而对于 min{min(...)}max{max(...)},内层的 min/max 可以直接去掉。
  • 调和级数思想min(n, m) ≤ √(nm)min(n, m) ≤ (n+m)/2。这些不等式常在复杂度分析和放缩时使用。
  • 期望与求和转化:时刻记住 Σ i*F(i) = Σ F(≥ i)。当直接计算 F(i) 困难时,计算 F(≥ i) 可能更自然。

🧱 数据结构与算法技巧

  • Trie树性质:在 Trie 树上,两个字符串的最长公共前缀(LCP) 对应的节点,就是这两个字符串对应节点的最近公共祖先(LCA)
  • 并查集扩展:在并查集上不仅可以维护连通性,还可以维护子树的和,从而支持快速的单点修改与所属集合的权值查询。
  • 01Trie根号平衡:当需要对 01Trie 进行根号平衡时,可以考虑使用 √V 叉的 01Trie,其中 V 是值域。
  • 静态区间单调栈:对于静态数组的区间单调栈查询问题(如问区间 [l, r] 内从 l 开始的单调栈),可以使用倍增(Jump Table) 进行预处理来快速回答。
  • 李超树扩展:李超树遇到需要增加一维偏序限制(例如,在区间 [l, r] 的函数中找最值)时,可以结合线段树维护凸包的技巧。
  • 二维数点简化:如果只是判断存在性(如是否存在纵坐标大于某值的点),二维数点问题有时可以退化为在一维上维护另一维的最值,无需完整二维数据结构。
  • 区间最值前缀/后缀:求区间 [l, r] 的最大前缀和或最大后缀和,可以先计算全局前缀和数组 pre[],问题转化为在 pre[l...r] 上求 pre[i] - pre[l-1] 的最大值,即 RMQ(l, r) - pre[l-1]
  • 子树贡献差分统计:对每个点维护子树内点对它的贡献和(类似 DSU on Tree),如果贡献可差分,可以在 DFS 过程中记录进入点 u 和离开点 u 时的全局贡献和 s,两者之差即为子树总贡献。
  • 分治复杂度分析:对于形如 T(n,k) = f(n) + T(n, k-1) + T(n/2, k-1) 的分治复杂度,通常有 T(n,k) = O(k * f(n)),且 k 常为 O(log n)
  • 树形背包复杂度:树上背包,如果每个节点的背包容量上限为 m,则总复杂度是 O(nm) 的,而不是 O(nm²)
  • 括号序性质:利用 DFS 序(括号序)判断节点关系:对于一个点 u,在 DFS 进入它时,不可能已经开始访问其子树;在离开它时,不可能已经结束访问其祖先。

🗺️ 图论与建模技巧

  • 环的等价表述
    1. 若干个不交简单环的并所有简单环和非简单环 存在双射关系。
    2. 所有简单环和非简单环 又与 DFS 树上由若干条返祖边形成的环的异或 存在双射。这是理解图中环空间基的基础。
  • 图论模型选择指南
    • 二分图:适用于“1对1”、“1对k”、“1对a[i]”的匹配,或棋盘黑白染色类问题(骨牌、马步)。别忘了霍尔(Hall)定理。
    • 最小割:适用于“二选一”或“选或不选”的决策问题,常带有矛盾代价。
    • 最大权闭合子图:适用于选择物品有依赖关系(前置条件)的问题。
    • 费用流:适用于可以表示为线性规划模型的问题(如志愿者招募),也可考虑其对偶。
    • 2-SAT:适用于布尔变量的“二选一”或“多选一”构造问题,条件多为“若A则B”形式。
  • 经典模型对偶
    • 二分图最大匹配 ⟺ 最小点覆盖(König定理)
    • 二分图最大权匹配 ⟺ 最小顶标和
  • 树上贪心:在树上要求选出尽可能多的链或连通块时,别忘了尝试 从叶子节点向上贪心,遇到能合并或选取的时机就立刻操作。参考题目:CF1039D。
  • 区间连边优化:用并查集处理“点与区间内所有点连边”时,可以利用均摊复杂度(如“并查集+向右跳”算法)高效解决,无需线段树优化建图。
  • 连通图性质
    • 连通块无环:森林
    • 连通块最多一个环:基环树森林
    • 连通块内部所有环两两不相交:沙漠图
  • 基环树判定:给无向边定向后,若每个点的出度(或入度)均为 1,则该图是基环树(内向/外向基环森林)。

🧮 动态规划与计数技巧

  • DP状态与答案互换:当 DP 的状态很多,但答案的值域很小时,可以考虑 交换 DP 维度的含义,将答案作为状态,可行性作为值。
  • 排列DP的多种视角
    1. 每次插入当前最大值(将 n-1 排列扩展为 n 排列)。
    2. 每次填入当前最大值(维护连续段,经典如“连续段DP”)。
    3. 每次在末尾填入一个数,并将前面所有大于等于它的数 +1(维护相对大小)。
  • 容斥的生成函数处理:当需要容斥时,可以在推导生成函数(GF)时直接将容斥系数 (-1)^k 带入,一步到位。
  • 集合幂级数卷积:做集合幂级数的半在线卷积时,可以popcount(元素个数)将下标分类,分别卷积,这相当于增加了一个类似子集卷积的限制。
  • 计数转组合意义:这是解决计数问题的核心思想之一。当代数推导复杂时,思考式子的组合意义往往能柳暗花明。
  • 贪心策略调整:贪心算法不一定一步到位求出最优解,可以先求出一组可行解,然后通过调整(反悔贪心)逼近最优
  • 区间DP决策单调性:区间 DP 若满足决策单调性(如石子合并),同一行或同一列的决策点是单调移动的,可以用二分队列优化,避免复杂的均摊分析。

📝 字符串、构造与杂项

  • 括号序列问题
    • 当用栈模拟匹配不好做时,可回归定义:不断删去相邻的 (),或考虑一个合法序列总能拆分成两个合法序列拼接。
    • 括号树(将括号序列转化为树形结构)是处理高级括号序列问题的强大工具。
  • 字符串匹配次数界:总长度为 m 的若干模式串,在一个长度为 n 的文本串中,所有模式串出现的总次数为 O(n√m)。这在分析 AC 自动机等算法的复杂度时有用。
  • 哈希策略
    • 字符串值域大时,适当增大哈希基数(Base)。
    • 为确保安全,尽量使用双模哈希,或自然溢出。
    • 对于“字母括号匹配”类问题(如 CSP-J 的“消消乐”),可以尝试矩阵哈希来维护结构信息。
  • AC自动机建图:当字符集很大时,构建 AC 自动机的 next 指针可以不用遍历字符集,而是直接在 fail 树上跳转,总复杂度与所有模式串总长相关。
  • 构造题思路
    • 对于“所有数相等”类操作问题,将操作视为边,数字视为点,问题可能转化为求这些点在某个树/图上的 LCA 或距离问题
    • 当正向难以思考时,考虑二分答案的推广:不仅最值可以二分,求任意解也可以二分(每次确定解在某一侧)。
  • 代码与常数优化
    • Python 输出超长整数时,需加 sys.set_int_max_str_digits(1000000) 调整限制。
    • cmath 中的 long double 数学函数可能比想象中慢。
    • 多次调用的“大”函数,不加 inline 可能比加上更快(避免代码膨胀)。
    • vector 的常数比数组大,长 vector 与数组接近。
  • 实用提醒
    • 不要忘记期望的线性性
    • 看到“平均值”条件,考虑分数规划
    • 树形 DP 有后效性时,考虑树上高斯消元
    • 模型建不出来时,换一种建模思路或许海阔天空。

第六篇

https://www.luogu.me/article/o0yp5tx3

核心技巧一览

1. 镜像法优化 DP

  • 核心思想:当动态规划中存在复杂的边界情况时,可以通过构造镜像状态来简化初始化和转移逻辑。
  • 应用场景:常用于线性DP或区间DP中,将边界状态复制或对称映射,使所有状态能用统一的转移方程处理,避免繁琐的特判。
  • 本质:一种通过增加状态或预处理来统一处理边界的思想。

2. 随机化处理“不少于一半”问题

  • 核心思想:当问题要求从集合中找出一个满足“不少于一半”元素具有某种性质的元素时,可以随机选取一个元素并进行验证
  • 原理:一个满足条件的元素在集合中占比至少为1/2,因此随机选取一次命中它的概率不低于50%。通过多次随机选取并验证,可以极大概率(随着尝试次数指数级增加)找到答案。
  • 优势:将复杂的构造或筛选问题转化为简单的验证问题,思想简单且代码易于实现。
  • 关键:需要有一个高效的验证算法。

3. 多路归并求前 K 大

  • 核心思想:需要从 m有序序列中找出全局前 k 大的元素时,使用优先队列(最小堆)进行多路归并。
  • 算法步骤
    1. 将每个序列的当前最大值(即其首个元素)放入优先队列。
    2. 从堆中弹出堆顶元素(当前全局最大),将其加入答案。
    3. 从弹出元素所在的序列中,取出下一个元素放入堆中。
    4. 重复步骤2-3,直到找到 k 个元素。
  • 时间复杂度O(k log m),优于将所有序列合并后再排序的 O(m*len*log(m*len))
  • 例题P1631 序列合并, P5283 异或粽子

4. NFA 转 DFA 计数合法方案

  • 核心思想:解决“有多少种存在合法方案”的计数问题时,可以将其建模为一个非确定有限状态自动机(NFA)。然后将NFA确定化,转换为确定有限状态自动机(DFA),并以DFA的状态集合作为动态规划的状态进行转移计数。
  • 关键点
    • NFA便于描述问题中复杂的转移关系。
    • DFA的状态是NFA状态的幂集,但实际问题中可达的状态集合数通常远小于理论最大值,可以被接受。
    • 在得到的DFA上,从初始状态到任意接收状态的路径数,就对应了原问题的方案数。
  • 应用场景:模式匹配、复杂规则下的字符串计数、某些游戏局面分析。
  • 例题:各类“麻将和牌型计数”题, THUPC 决赛 2024 LAT_mujin_pc_2018_h

5. 实数二分求精确分数解

  • 核心思想:当需要二分一个分数答案但不会处理 Stern-Brocot 树等分数二分技巧时,可以先在实数域上进行二分,得到一个满足精度的实数解。然后再根据这个实数解和问题的具体约束,构造或推算出精确的分数解
  • 步骤
    1. 在实数范围内二分,得到一个满足误差要求的近似值 x
    2. 利用 x 和原问题的条件(如所有变量为整数、需要最简分数等),通过数学推导或枚举可能的分母,找到最接近 x 且满足所有约束的分数。
  • 优点:思维难度低,规避了复杂的分数运算和比较。
  • 例题HDU8053

posted @ 2026-01-07 19:38  Chestify  阅读(78)  评论(0)    收藏  举报