开题相关:
- 拿到题先看时空!先看时空!先看时空!
- 一切建立在看完时空的前提下,最主要的就是先读题面,千万别急,大概理解了再模样例,如果长时间读不懂先看后面的。
- 大概理解了就去看数据范围,这个很重要,很有可能正解或很多的部分分可以从数据范围倒推出来。重点注意一些枚举状态相关,比如 10~20 这种。一定要把所有数据范围都看清楚,出题人会在里面放一些神秘 corner,少一个都会挂大分。
- 感觉会了题不要太兴奋,仔细算算想一想有没有什么地方复杂度不符合第一直觉,别到写了一半的时候发现假了,心态会爆炸的。
- 长时间写不出,斟酌一下,感觉就差一点点就再给自己一小块时间——这样是理想状况,因为写不完就跳无论是谁心里都会变慌。发现确实希望不大就别犹豫,清空大脑去看其它题。有时候会有奇效,因为你现在掉进死循环出不来了,这时候跳脱出去回来再审视会好一些。
- 多少研究一下大样例,看看有没有强度,如果强度很高那真的没必要再补一个拍子,感觉有欠缺,先思考一下 corner case,最后再写拍子。写拍子要格外小心,不要在暴力上浪费很多时间,多拍一些让它挂着就行了,先看别的,一会儿回来看。
- 发现没错那很好了,有错就先看数据是不是有某些特性,然后逼自己静态查一遍,尤其是自己错过的地方和边界等等易错的情况。然后就是输出中值和
assert(0)之类的东西了。善用-fsanitize和-Wall能解决大量的麻烦。 - 确认能过后相信自己,不要隔三差五回来看看,都做了这么多步检查调试了,相信自己就好了。
- 别出唐错,尤其是文件名之类的东西,不过也别太过紧张,一定最后留 5~10 min 检查这些就好了。
- 别想别人能不能过这题,分数线是多少,跟你有关系吗,万一大家都爆炸了就你赢了呢?
- 有 Day 2 的场——当然我是没机会打了——别一出场就瞎讨论,讨论到每一分都明明白白那种,实在不行就和所有人说你 AK 了,搞崩别人心态也比自己听他们瞎扯强。
PS:建议存一下自己题库的题,可能不知道哪天就隐藏了!
由于作者水平有限以及时间仓促,不保证每道题都是绝对准确地对应给出的技巧。
基础技巧
- 总之二分就对了!二分答案是极常见且简单的 trick,把寻找转化为判定这一步非常有用。以及一些最优性问题,比如求差值最小等等,经过对判断式子的移项,找出具有单调性的某一部分,将另一部分作为比较值进行二分查找即可快速求解。CSP模拟24 T4 道路重建,CSP 模拟22 T3 传令
- 形如“等于”转化为“大于等于减去大于”的简单容斥,转化一些单独很难处理但是一定范围好处理的题目。P7410 [USACO21FEB] Just Green Enough S
- 折半搜索,能把比较神人的暴搜 \(2^n\) 优化成没那么神人的 \(2^{\frac{n}{2}}\) ,但是这不是最主要的,重要的是 meet int middle 这种思想,之前正赛中也出现过这样的问题, [CSP-S 2022] 假期计划
- 鸽笼原理,理论非常简单,但并不会出裸题,大概需要一些转化,基本是最后一步,P10136 [USACO24JAN] Cowlendar S
- 把要求的答案式子移项以后转化为可以判定的下标等物,CSP模拟19 T3 树上询问(query)
- 数据范围或者式子转化后范围与除法或取模有关,考虑阈值分治,CSP模拟24 T2 凑数,CSP模拟42 T1 乘筛积,板子:P3396 哈希冲突,P4807 [CCC 2017] 地铁交通
- 贪心、构造题,考虑题目中给出的图是否具有某种特性,比如重复、循环、同构、交错等等,这类题比较多,套路也不固定。P7301 [USACO21JAN] Spaced Out S
- 正难则反,简单容斥一步,这个就不用多说了。P11362 [NOIP2024] 遗失的赋值
- 遇到两种互逆操作,比如给一个数乘或除以相同的值,发现其中一种至多操作一次(因为会抵消,绝对不优)。P8093 [USACO22JAN] Searching for Soulmates S
- 从部分分推导出结论,或者说从特殊推广到一般。P9755 [CSP-S 2023] 种树
- 在搜索时加入一些贪心成分,能够发挥很大的剪枝作用。P2218 [HAOI2007] 覆盖问题
图论技巧
- 最短路树。可以求解最小环以及边数接近点数等特殊问题。CF1051F ,CSP模拟1 T2 那一天她离我而去(这份题解用的分组最短路)
- 删边转化为加边/加边转化为删边,这个的应用比较广泛,同样是比较重要的思想,常与连通性以及最大最小化相关知识结合。P1197 [JSOI2008] 星球大战,P2700 逐个击破
- 枚举分界边。形如一边被 a 管辖一边被 b 管辖,或者两边颜色等不同的情况,可以通过枚举分界边实现边数相关复杂度。这个东西是正解的情况没有那么多,但是很多题都会给它不少部分分。CSP模拟10 T2 虚图
- 把在同一连通块内的一些点看作一个整体考虑。P7991 [USACO21DEC] Connecting Two Barns S
- 一些看起来比较古怪,但是有一定的特征(比如通过多少步就可以转移到下一个状态),可以考虑图论建模 P14402 [JOISC 2016] 危险的滑冰 / Dangerous Skating
- 最小生成树将有用边从 \(O(m)\) 降为 \(O(n)\) 级别。P14362 [CSP-S 2025] 道路修复
- 看到两种类型互相选择/匹配问题,直接想到建模为二分图匹配。P10936 导弹防御塔
- 抽象出不同节点的父子或起点终点关系,建立出 DAG ,然后拓扑排序。P7077 [CSP-S 2020] 函数调用
- 极其稠密的图或满图,floyed 往往能发挥作用。且其修改一条边权再重新统计最短路的复杂度是 \(O(n^2)\) 的。AT_abc416_e [ABC416E] Development
数论技巧
- 考虑模的定义,$ x \bmod y = x-\lfloor \frac{x}{y}\rfloor y$ ,在一些推柿子的题目里能发挥作用。CSP模拟9 T1 天才俱乐部。
- 值域极大以至于分解质因数等根号相关失效时,可以考虑题目所求答案性质尝试 n 次根号等特殊复杂度,有时会有奇效。CSP模拟5 T2 可爱捏,P9118 [春季测试 2023] 幂次
- \(n\) 以内的质数为 $ \frac{n}{\ln(n)}$ 级别,善用这个性质可以极大地优化复杂度,比如有些题目通过观察可以轻易得到枚举合数是不必要的。CSP模拟5 T2 可爱捏,对这个题就可以用这个技巧创过去。其它还有很多题不胜枚举了。
- 注意到一个数本质不同质因子极少,甚至小于\(\log V\) 级别,可以根据这个统计很多东西 CSP模拟11 T2 质数中的质数
字符串技巧
- 二分哈希,这个真用说吗,伟大无需多言。可以跟大部分串串题碰一碰,实在没招了别忘了它!CSP模拟5 T3 诗
- 用 KMP 处理出字符串的 nxt 数组,然后用它们进行图论建模,NOIP2025模拟5 T3 选取字符串
- 字符串单独匹配比较困难时,可以考虑把多个串通过某种形式(比如加特殊字符)合并在一起。P14363 [CSP-S 2025] 谐音替换
树上问题技巧
- 启发式合并,太多了懒得说了,小的合到大的上,总之 \(\log\),许多数据结构都能实现这个。P3201 [HNOI2009] 梦幻布丁
- 树上拓扑排序计数有经典结论 \(\frac{n!}{\prod siz_u}\) ,这是因为每个点 u 的子树内部排列都只有 \(\frac{1}{siz_u}\) 种是合法的(即 \(u\) 在最前面的那一些)。属于是不知道结论有点麻烦知道了就巨简单那种,[ABC160F] Distributing Integers
- 树上距离拆项变成 \(dep_{u}+dep_{v}-2\times dep_{lca}\)后可以移项,利用这个转化去实现一些比较厉害的东西。CSP模拟19 T3 树上询问(query)
数据结构技巧
- 并查集维护序列连续段信息,这是个经典东西,见过若干次了。CSP模拟12 T1 114514,P4117 [Ynoi2018] 五彩斑斓的世界,P3987 我永远喜欢珂朵莉~
- 势能线段树,建议学习一下,单纯的势能分析也很重要。P4145 上帝造题的七分钟 2 / 花神游历各国,感觉比较厉害的学习笔记
- 线段树维护比较复杂的信息,合并区间时需要处理很多中点相关信息,需要多练习。P5069 [Ynoi Easy Round 2015] 纵使日薄西山
DP 技巧
- 用你喜欢的数据结构优化 DP,这个不能叫技巧,但是观察到决策点与最值/之前决策位置的集合有关的题目,需要很快地想到数据结构维护,比如线段树维护最值,树状数组维护决策点位置等等。CSP模拟10 T1 二分图匹配
- 有两种容量的背包,可以融合贪心的思想分别从前缀和后缀做一遍 DP,最后枚举中间交点取得最值。P8903 [USACO22DEC] Bribing Friends G
- 将多重约束转化成多维前缀和,CSP模拟23 T1
- 预设型DP,比较巧妙,枚举的是当前放哪个数,建议自学一下,P7967 [COCI 2021/2022 #2] Magneti
- 设计 DP 状态时,可以把当前填哪个数设为其中一维,也算是比较经典,但我见的少,CSP模拟38 T2 数排列
- 形如 \((a+1)^2\) 的式子,运用小学知识可得到 \(a^2+2a+1\),这样在 DP 时更容易维护,比较经典的拆项,CSP模拟32 T2 小 Z 爱划分
- 想不到怎么优化?观察 DP 本质不同决策点是否很少,考虑只从有用的决策点转移。CSP模拟41 T1 数轴取物
- 用方案数是否大于 0 判断是否可行,NOIP2025模拟3 T2 忍者小队
- 费用提前计算。[ARC126D] Pure Straight
- 记录与当前位置同色/有相同特征的点进行转移。P9753 [CSP-S 2023] 消消乐,P11233 [CSP-S 2024] 染色
二进制相关技巧
- ST表维护区间位运算,我知道这个太常见了,但是这是私货,单纯想推一道对我很重要的题( U300220 朵(dorr)
- 看到二进制首先想到拆位,有非常多性质。P4310 绝世好题
- 每个数的值至多通过按位或更改 \(w\) 次(\(w\) 是二进制位个数)。类似于上面势能线段树的例题,打上标记即可。P7492 [传智杯 #3 决赛] 序列
杂项
- 矩阵上的问题。有时不妨想想可不可以固定上下两边或者左右两边,再用前缀和或数据结构等物维护中间部分。CSP模拟6 T1 花海,P7149 [USACO20DEC] Rectangular Pastur
- 凸包,这个好像有很多应用,比如线段树维护栈维护之类的,但我确实不会这个东西。QOJ 5500
- 用并查集维护置换环,将循环移动问题转化为简单的环上问题,P7299 [USACO21JAN] Dance Mooves S
- 异或哈希,用于快速找到一个组合是否出现、序列中的数是否出现了 k 次,建议自行寻找学习笔记进行学习。CSP模拟30 T2 彻天之火
- 最多只有 \(O(w)\) 个数满足未来加入某些新数后这个数有可能变成最大按位与的两个数之一。只需要记录这些数。(\(w\) 表示二进制位数的范围),CSP模拟37 T3 符文石
- 分治背包,猫树分治板子,见过两回可惜没机会学了/ll。P6240 好吃的题目,NOIP2025模拟赛12 T3 盲盒流水线
- 形如 \(a\times b\le c\) 的形式,注意三个变量的范围,有可能其中一个取值范围或能取到的点极少,这时可以枚举它获得答案。P6005 [USACO20JAN] Time is Mooney G
- 碰撞后不折返,看作是穿过。非常经典的 trick 的,应该人尽皆知了。P8048 [COCI 2015/2016 #4] ENDOR
- 说不上来这题是什么技巧,大概是一些特殊的处理方式?建议自己做做。P11659 小夫
- \(1e9\) 级别的数开方五次就会变成 \(1\)。P7334 [JRKSJ R1] 吊打
- bitset 维护颜色是否出现/不同位置或区间出现颜色种类的交集。P4688 [Ynoi Easy Round 2016] 掉进兔子洞
鸣谢:
- Wy_x 将校内题目的链接尽力替换成了题解和原题链接,他对技巧的补充
- QEDQEDQED 对内容进行了详细的分类,祝我的小学弟进队!