竞赛装备
上考场之前,这几张表建议背下来:一张是「看到数据规模该用什么算法」, 一张是「别人都在哪摔过跟头」。
复杂度速查表
拿到题目第一件事:看 n 有多大,反推该写什么算法
| 数据规模 | 可接受复杂度 | 典型算法 | 备注 |
|---|
!
换算常识:
C++ 在竞赛评测机上,一秒大约能跑
1×10⁸ 次简单运算。
所以 n = 1e5 时,O(n²) 是 10¹⁰ 次,必然超时;而 O(n log n) 只有约 1.7×10⁶ 次,稳过。
这个「一秒一亿次」的直觉,是选择算法的第一依据。
竞赛坑点库
21 条高频错误,每一条都对应一个真实的失分场景
对拍:自己找出自己的错
竞赛里最实用的调试技能,没有之一
什么时候用它
代码过了样例,但一提交就 WA。这时不要盯着代码看,写个暴力程序对拍,让机器帮你找反例。
三个程序
- 你的正解(可能错的那个)
- 暴力程序(慢但一定对)
- 随机数据生成器
一个关键技巧
数据规模先开小(n ≤ 10),容易撞出反例;跑通之后再逐步放大。 如果小数据永远对、大数据才错,那多半是溢出或者 数组开小了。
gen.cpp + 对拍脚本
1# 随机数据生成器 gen.cpp
2mt19937 rng(chrono::steady_clock::now()
3 .time_since_epoch().count());
4int n = rng() % 10 + 1; // 小数据先测
5printf("%d\n", n);
6for (int i = 0; i < n; i++)
7 printf("%d ", (int)(rng() % 100));
8# 对拍脚本(Windows 批处理)
9:loop
10gen > in.txt
11slow < in.txt > slow.out
12fast < in.txt > fast.out
13fc slow.out fast.out
14if not errorlevel 1 goto loop
15echo 找到反例!看 in.txt
输入输出模板
数据量超过 10⁶ 时,cin 不关流同步会直接 TLE
C++
1#include <bits/stdc++.h>
2using namespace std;
3int main() {
4 ios::sync_with_stdio(false); // 关掉与 C 的同步
5 cin.tie(nullptr); // 解除 cin/cout 绑定
6 // 循环里输出用 '\n',不要用 endl
7 // endl 每次都强制刷新缓冲区,会慢十倍以上
8 return 0;
9}