图论建模
核心不是写最短路,而是把题面里的关系翻译成点与边。分层图、拆点、状态图是省一题的常见入口。
- Dijkstra(堆优化)
- Floyd
- Kruskal
- 拓扑排序
- 差分约束
算法专题
三档内容对应三种目标。用法很直接:先在第一档自查,能默写就跳过;第二档是冲 CSP-S 一等与省一的主战场; 第三档只在明确要打省选、进省队时才有意义——过早投入高阶专题,是很多人卡住的原因。
第一档 · 自查
这些不解释了,只列标准:不看资料、5 分钟内写出能过的版本。 超过 3 项做不到,先回去补,不要往下看第三档。
sort + 自定义比较,结构体与多关键字排序lowbit、异或性质、状态压缩表达第二档 · 主战场
这一档决定你能否从「会基础」跨到「能拿奖」。要求不只是会模板,而是知道每个模型的适用条件与代价。 建议顺序:图论 → 树 → 数据结构 → DP → 优化。
核心不是写最短路,而是把题面里的关系翻译成点与边。分层图、拆点、状态图是省一题的常见入口。
树是最常出现的图。要熟练到能直接写出遍历框架,再往上叠 dfs 序与数据结构。
看到「单点修改 + 区间查询」先想树状数组,看到「区间修改 + 区间查询」才上懒标记线段树。
难点永远是「状态怎么定义」。定义对了,转移往往是机械的;定义错了,怎么优化都没用。
能写出 O(n²) 方程只是及格线,能压到 O(n) 才拿得到分。先判断转移式里有没有单调性。
哈希几乎能解决所有「区间是否相同」类问题,但必须防冲突:双哈希或随机底数,别用裸 131。
竞赛用的数论很窄:快速幂、筛法、逆元、组合数取模,加上容斥。写一次模板,每场都用得到。
没有模板可套,只能靠手玩小数据找规律。训练方法:所有样例都在纸上手算一遍,先猜结论再验证。
OI 赛制里这是最被低估的技能。按子任务分档写暴力,常常比死磕正解得分更高。
第三档 · 省选与 NOI
这些专题的共同点是:学习成本高、适用范围窄。省选前的正确顺序是先查漏第二档, 再按「出现频率 × 自己的薄弱程度」挑两三个,而不是全学一遍。
难点在建模:能不能把题目的限制翻译成容量与边。学会判定「什么时候该想到最小割」比背 Dinic 更重要。
把树上路径问题转成序列问题。树剖是省选常规武器,LCT 是少数题型的杀手锏。
处理「路径计数」与「子树信息合并」的标准工具,配合桶与树状数组使用。
共同思路是「换一个更便宜的询问顺序」。看到「多组询问 + 可离线」就该条件反射。
后缀数组与 AC 自动机在省选出现频率不低,但代码量大,务必练到能默写。
矩阵加速线性递推几乎必考;多项式与生成函数属于「会一次能用很久」的投入。
代码量大、精度坑多,建议最后再投入。写之前先想清楚用整数还是浮点、怎么处理共线。
交互、提交答案、强制在线——它们的解法往往不难,难在读不懂题与本地调试。
同复杂度下被卡常数是最冤的失分。连续内存、位运算代替取模、减少函数调用都是常规操作。
速查
评测机每秒约 10⁸ 次简单运算。带哈希、取模、树的随机访问后常数会变大,实际要按 10⁷–10⁸ 打折扣。
| 数据规模 n | 可接受复杂度 | 通常对应什么做法 |
|---|---|---|
≤ 20 | O(2ⁿ·n) | 状压 DP、子集枚举 |
≤ 300 | O(n³) | Floyd、区间 DP、矩阵乘法 |
≤ 5000 | O(n²) | 点对枚举、二维 DP |
≤ 10⁵ | O(n√n) / O(n log²n) | 分块、莫队、树剖 + 线段树 |
≤ 10⁶ | O(n log n) | 排序、二分、树状数组、最短路 |
≥ 10⁷ | O(n) 或更小 | 扫描、前缀和、单调队列、基数排序 |
下一步:把它排进训练路线 → 或 找题源练手 →