OI 常见经典技巧 (遗产)

开题相关:

  1. 拿到题先看时空!先看时空!先看时空!
  2. 一切建立在看完时空的前提下,最主要的就是先读题面,千万别急,大概理解了再模样例,如果长时间读不懂先看后面的。
  3. 大概理解了就去看数据范围,这个很重要,很有可能正解或很多的部分分可以从数据范围倒推出来。重点注意一些枚举状态相关,比如 10~20 这种。一定要把所有数据范围都看清楚,出题人会在里面放一些神秘 corner,少一个都会挂大分。
  4. 感觉会了题不要太兴奋,仔细算算想一想有没有什么地方复杂度不符合第一直觉,别到写了一半的时候发现假了,心态会爆炸的。
  5. 长时间写不出,斟酌一下,感觉就差一点点就再给自己一小块时间——这样是理想状况,因为写不完就跳无论是谁心里都会变慌。发现确实希望不大就别犹豫,清空大脑去看其它题。有时候会有奇效,因为你现在掉进死循环出不来了,这时候跳脱出去回来再审视会好一些。
  6. 多少研究一下大样例,看看有没有强度,如果强度很高那真的没必要再补一个拍子,感觉有欠缺,先思考一下 corner case,最后再写拍子。写拍子要格外小心,不要在暴力上浪费很多时间,多拍一些让它挂着就行了,先看别的,一会儿回来看。
  7. 发现没错那很好了,有错就先看数据是不是有某些特性,然后逼自己静态查一遍,尤其是自己错过的地方和边界等等易错的情况。然后就是输出中值和 assert(0) 之类的东西了。善用 -fsanitize-Wall 能解决大量的麻烦。
  8. 确认能过后相信自己,不要隔三差五回来看看,都做了这么多步检查调试了,相信自己就好了。
  9. 别出唐错,尤其是文件名之类的东西,不过也别太过紧张,一定最后留 5~10 min 检查这些就好了。
  10. 别想别人能不能过这题,分数线是多少,跟你有关系吗,万一大家都爆炸了就你赢了呢?
  11. 有 Day 2 的场——当然我是没机会打了——别一出场就瞎讨论,讨论到每一分都明明白白那种,实在不行就和所有人说你 AK 了,搞崩别人心态也比自己听他们瞎扯强。

PS:建议存一下自己题库的题,可能不知道哪天就隐藏了!

由于作者水平有限以及时间仓促,不保证每道题都是绝对准确地对应给出的技巧。

基础技巧

  1. 总之二分就对了!二分答案是极常见且简单的 trick,把寻找转化为判定这一步非常有用。以及一些最优性问题,比如求差值最小等等,经过对判断式子的移项,找出具有单调性的某一部分,将另一部分作为比较值进行二分查找即可快速求解。CSP模拟24 T4 道路重建CSP 模拟22 T3 传令
  2. 形如“等于”转化为“大于等于减去大于”的简单容斥,转化一些单独很难处理但是一定范围好处理的题目。P7410 [USACO21FEB] Just Green Enough S
  3. 折半搜索,能把比较神人的暴搜 \(2^n\) 优化成没那么神人的 \(2^{\frac{n}{2}}\) ,但是这不是最主要的,重要的是 meet int middle 这种思想,之前正赛中也出现过这样的问题, [CSP-S 2022] 假期计划
  4. 鸽笼原理,理论非常简单,但并不会出裸题,大概需要一些转化,基本是最后一步,P10136 [USACO24JAN] Cowlendar S
  5. 把要求的答案式子移项以后转化为可以判定的下标等物,CSP模拟19 T3 树上询问(query)
  6. 数据范围或者式子转化后范围与除法或取模有关,考虑阈值分治,CSP模拟24 T2 凑数CSP模拟42 T1 乘筛积,板子:P3396 哈希冲突P4807 [CCC 2017] 地铁交通
  7. 贪心、构造题,考虑题目中给出的图是否具有某种特性,比如重复、循环、同构、交错等等,这类题比较多,套路也不固定。P7301 [USACO21JAN] Spaced Out S
  8. 正难则反,简单容斥一步,这个就不用多说了。P11362 [NOIP2024] 遗失的赋值
  9. 遇到两种互逆操作,比如给一个数乘或除以相同的值,发现其中一种至多操作一次(因为会抵消,绝对不优)。P8093 [USACO22JAN] Searching for Soulmates S
  10. 从部分分推导出结论,或者说从特殊推广到一般。P9755 [CSP-S 2023] 种树
  11. 在搜索时加入一些贪心成分,能够发挥很大的剪枝作用。P2218 [HAOI2007] 覆盖问题P2540 [NOIP 2015 提高组] 斗地主 加强版
  12. 有时,贪心地考虑单步最优可以推广到全局最优。P12479 [集训队互测 2024] 长野原龙势流星群
  13. 线段覆盖按左端点排序,非常非常经典的贪心,一定要了解。P11232 [CSP-S 2024] 超速检测
  14. 相邻两个不能同时选择的经典贪心模型。P1484 种树

图论技巧

  1. 最短路树。可以求解最小环以及边数接近点数等特殊问题。CF1051F ,CSP模拟1 T2 那一天她离我而去(这份题解用的分组最短路)
  2. 删边转化为加边/加边转化为删边,这个的应用比较广泛,同样是比较重要的思想,常与连通性以及最大最小化相关知识结合。P1197 [JSOI2008] 星球大战P2700 逐个击破
  3. 枚举分界边。形如一边被 a 管辖一边被 b 管辖,或者两边颜色等不同的情况,可以通过枚举分界边实现边数相关复杂度。这个东西是正解的情况没有那么多,但是很多题都会给它不少部分分。CSP模拟10 T2 虚图
  4. 把在同一连通块内的一些点看作一个整体考虑。P7991 [USACO21DEC] Connecting Two Barns S
  5. 一些看起来比较古怪,但是有一定的特征(比如通过多少步就可以转移到下一个状态),可以考虑图论建模 P14402 [JOISC 2016] 危险的滑冰 / Dangerous Skating
  6. 最小生成树将有用边从 \(O(m)\) 降为 \(O(n)\) 级别。P14362 [CSP-S 2025] 道路修复
  7. 看到两种类型互相选择/匹配问题,直接想到建模为二分图匹配。P10936 导弹防御塔
  8. 抽象出不同节点的父子或起点终点关系,建立出 DAG ,然后拓扑排序。P7077 [CSP-S 2020] 函数调用
  9. 极其稠密的图或满图,floyed 往往能发挥作用。且其修改一条边权再重新统计最短路的复杂度是 \(O(n^2)\) 的。AT_abc416_e [ABC416E] Development
  10. 还有一类把关系抽象成基环树的问题,一般是要给你某种限制让你在上面做染色状物。P9869 [NOIP2023] 三值逻辑
  11. 注意到虚树由十级降到了八级,猜测以后可能会出现在一些题目中,而且虚树的思想在一些不用显式建虚树的题目中也有应用。P2495 【模板】虚树 / [SDOI2011] 消耗战

数论技巧

  1. 考虑模的定义,$ x \bmod y = x-\lfloor \frac{x}{y}\rfloor y$ ,在一些推柿子的题目里能发挥作用。CSP模拟9 T1 天才俱乐部
  2. 值域极大以至于分解质因数等根号相关失效时,可以考虑题目所求答案性质尝试 n 次根号等特殊复杂度,有时会有奇效。CSP模拟5 T2 可爱捏,P9118 [春季测试 2023] 幂次
  3. \(n\) 以内的质数为 $ \frac{n}{\ln(n)}$ 级别,善用这个性质可以极大地优化复杂度,比如有些题目通过观察可以轻易得到枚举合数是不必要的。CSP模拟5 T2 可爱捏,对这个题就可以用这个技巧创过去。其它还有很多题不胜枚举了。
  4. 注意到一个数本质不同质因子极少,甚至小于\(\log V\) 级别,可以根据这个统计很多东西 CSP模拟11 T2 质数中的质数
  5. 下取整可以看做取某个数的整数部分。\(\lfloor \frac{x+a}{b}\rfloor = \lfloor \frac{x}{b}\rfloor+ \lfloor \frac{a}{b}\rfloor + [a\bmod b+x\bmod b \ge b]\)P11660 我终将成为你的倒影
  6. 变换求和顺序,这个没有例题,因为全都是例题,是个较难的题就要使用。
  7. 组合恒等式,基本上 OI Wiki 上囊括了大部分,其中范德蒙恒等式比较常见也比较偏门,可以记一下。

字符串技巧

  1. 二分哈希,这个真用说吗,伟大无需多言。可以跟大部分串串题碰一碰,实在没招了别忘了它!CSP模拟5 T3 诗
  2. 用 KMP 处理出字符串的 nxt 数组,然后用它们进行图论建模,NOIP2025模拟5 T3 选取字符串
  3. 字符串单独匹配比较困难时,可以考虑把多个串通过某种形式(比如加特殊字符)合并在一起。P14363 [CSP-S 2025] 谐音替换

树上问题技巧

  1. 启发式合并,太多了懒得说了,小的合到大的上,总之 \(\log\),许多数据结构都能实现这个。P3201 [HNOI2009] 梦幻布丁P5290 [十二省联考 2019] 春节十二响
  2. 树上拓扑排序计数有经典结论 \(\frac{n!}{\prod siz_u}\) ,这是因为每个点 u 的子树内部排列都只有 \(\frac{1}{siz_u}\) 种是合法的(即 \(u\) 在最前面的那一些)。属于是不知道结论有点麻烦知道了就巨简单那种,[ABC160F] Distributing Integers
  3. 树上距离拆项变成 \(dep_{u}+dep_{v}-2\times dep_{lca}\)后可以移项,利用这个转化去实现一些比较厉害的东西,点权当然也是同理。CSP模拟19 T3 树上询问(query) P2633 Count on a tree
  4. 树上莫队,虽然很难出这样的正解,但是可以拿到不少部分分。P4074 [WC2013] 糖果公园

数据结构技巧

  1. 并查集维护序列连续段信息,这是个经典东西,见过若干次了。CSP模拟12 T1 114514P4117 [Ynoi2018] 五彩斑斓的世界P3987 我永远喜欢珂朵莉~
  2. 势能线段树,建议学习一下,单纯的势能分析也很重要。P4145 上帝造题的七分钟 2 / 花神游历各国P9989 [Ynoi Easy Round 2023] TEST_69,感觉比较厉害的学习笔记
  3. 线段树维护比较复杂的信息,合并区间时需要处理很多中点相关信息,需要多练习。P5069 [Ynoi Easy Round 2015] 纵使日薄西山
  4. 比较经典的线段树+并查集。P7907 [Ynoi2005] rmscne
  5. 维护一些很难处理的问题,在复杂度充裕的前提下首选分块。数列分块入门 1~9 就是最经典的题目,可以将单纯的根号复杂度扩展到更多形式。P13977 数列分块入门 2
  6. 当合并块之间信息复杂度过高时,分块不能存储每块信息,这时可以考虑存储第 \(i~j\) 块的信息,避免合并时的麻烦。P4135 作诗
  7. 线段树递归式 pushup ,非常典的一道题。P4198 楼房重建
  8. 将一个区间询问拆成两个单点询问然后扫描线,这个就更经典了,太多了,读者应该会经常遇见。
  9. 带区间修改的区间第 k 大,树套树做不了,但分块可以做。P5356 [Ynoi Easy Round 2017] 由乃打扑克
  10. 分块维护下一个到达的位置,当然也可以 LCT 维护,但分块思想更灵活也更好想好写,也是比较经典的题目了。P3203 [HNOI2010] 弹飞绵羊

DP 技巧

  1. 用你喜欢的数据结构优化 DP,这个不能叫技巧,但是观察到决策点与最值/之前决策位置的集合有关的题目,需要很快地想到数据结构维护,比如线段树维护最值,树状数组维护决策点位置等等。CSP模拟10 T1 二分图匹配
  2. 有两种容量的背包,可以融合贪心的思想分别从前缀和后缀做一遍 DP,最后枚举中间交点取得最值。P8903 [USACO22DEC] Bribing Friends G
  3. 将多重约束转化成多维前缀和,CSP模拟23 T1
  4. 预设型DP,比较巧妙,枚举的是当前放哪个数,建议自学一下,P7967 [COCI 2021/2022 #2] Magneti
  5. 设计 DP 状态时,可以把当前填哪个数设为其中一维,也算是比较经典,但我见的少,CSP模拟38 T2 数排列
  6. 形如 \((a+1)^2\) 的式子,运用小学知识可得到 \(a^2+2a+1\),这样在 DP 时更容易维护,比较经典的拆项,CSP模拟32 T2 小 Z 爱划分
  7. 想不到怎么优化?观察 DP 本质不同决策点是否很少,考虑只从有用的决策点转移。CSP模拟41 T1 数轴取物
  8. 用方案数是否大于 0 判断是否可行,NOIP2025模拟3 T2 忍者小队
  9. 费用提前计算。[ARC126D] Pure Straight
  10. 记录与当前位置同色/有相同特征的点进行转移。P9753 [CSP-S 2023] 消消乐P11233 [CSP-S 2024] 染色
  11. 多边形转笛卡尔树,这个思想比较常见,但我确实一直没太学明白笛卡尔树。P6453 [COCI 2008/2009 #4] PERIODNI

二进制相关技巧

  1. ST表维护区间位运算,我知道这个太常见了,但是这是私货,单纯想推一道对我很重要的题( U300220 朵(dorr)
  2. 看到二进制首先想到拆位,有非常多性质。P4310 绝世好题
  3. 每个数的值至多通过按位或更改 \(w\) 次(\(w\) 是二进制位个数)。类似于上面势能线段树的例题,打上标记即可。P7492 [传智杯 #3 决赛] 序列
  4. \(k\) 很小的时候,考虑 \(2^k\) 枚举状态,注意 \(k\) 有可能并不会直接给出,自己需要锻炼发现的能力。P7145 [THUPC 2021 初赛] 合法序列

杂项

  1. 矩阵上的问题。有时不妨想想可不可以固定上下两边或者左右两边,再用前缀和或数据结构等物维护中间部分。CSP模拟6 T1 花海P7149 [USACO20DEC] Rectangular Pastur
  2. 凸包,这个好像有很多应用,比如线段树维护栈维护之类的,但我确实不会这个东西。QOJ 5500
  3. 用并查集维护置换环,将循环移动问题转化为简单的环上问题,P7299 [USACO21JAN] Dance Mooves S
  4. 异或哈希,用于快速找到一个组合是否出现、序列中的数是否出现了 k 次,建议自行寻找学习笔记进行学习。CSP模拟30 T2 彻天之火
  5. 最多只有 \(O(w)\) 个数满足未来加入某些新数后这个数有可能变成最大按位与的两个数之一。只需要记录这些数。(\(w\) 表示二进制位数的范围),CSP模拟37 T3 符文石
  6. 分治背包,猫树分治板子,见过两回可惜没机会学了/ll。P6240 好吃的题目NOIP2025模拟赛12 T3 盲盒流水线
  7. 形如 \(a\times b\le c\) 的形式,注意三个变量的范围,有可能其中一个取值范围或能取到的点极少,这时可以枚举它获得答案。P6005 [USACO20JAN] Time is Mooney G
  8. 碰撞后不折返,看作是穿过。非常经典的 trick 的,应该人尽皆知了。P8048 [COCI 2015/2016 #4] ENDOR
  9. 说不上来这题是什么技巧,大概是一些特殊的处理方式?建议自己做做。P11659 小夫
  10. \(1e9\) 级别的数开方五次就会变成 \(1\)P7334 [JRKSJ R1] 吊打
  11. bitset 维护颜色是否出现/不同位置或区间出现颜色种类的交集。P4688 [Ynoi Easy Round 2016] 掉进兔子洞
  12. __gnu_pbds 里封装了一些好用的模板,个人觉得比较有用的是 cc_hash_table,gp_hash_table,以及priority_queue(与普通堆区别在于有合并操作,可以方便地合并两个堆)。其余的个人认为作用不大,感兴趣可以自学一下。
  13. 最后就是乱搞。不得不提的一环吧。像摩尔投票等含有随机性的东西其实不算乱搞(顺便普及一下摩尔投票)P8496 [NOI2022] 众数。在比赛中,可以选择不同的贪心策略取最优答案,可以用随机性算法尽量骗分。不要觉得麻烦觉得丢人,哪怕多对一个点就是胜利。做点乱搞也要比束手无策强。

鸣谢:

后记

写这篇文章的时候本来已经很颓然了,但一敲起键盘,就好像又找回了当初学习算法竞赛的热情。
因为之前学习的时候,很少能找到较为详细的基础 trick 总结,所以心血来潮花了一整天写了这些东西。
我在这条道路上走了太多弯路,所以不希望后人再费大力气在找题和总结这种工作上面,你们值得更远的未来,那是我触摸不到的未来。
因为本人的一些问题,退出已经是我最好的选择,但还是希望你,我的读者朋友,能够坚持下去。
希望它能给你一点助力,哪怕七十七条中有一条帮助了你,我就心满意足了。
祝你天天开心!

By S_Keep_Kiding
最后更新:2025年11月25日下午,于机房。

posted @ 2025-11-25 10:10  S_Keep_Kiding  阅读(209)  评论(5)    收藏  举报