错误诊断
先把错误分对类,再谈怎么改
CE / 思路 / 边界 / 复杂度 / 粗心 —— 五类错误的症状、定位方法与修正清单。
语法错误 CE
编译不通过:头文件缺失、变量未定义、分号括号不匹配、类型不匹配。
如何定位
看编译器第一条报错行号,向上找真正原因;CE 一般不是思路问题。
修正清单
- 背熟常用头文件与 STL 写法
- 检查变量名拼写与作用域
- 函数声明与定义签名是否一致
- 数组下标类型是否为整型
考场急救 60 秒
- 看第一条报错的行号,往上 3 行找原因
- 90% 的 CE 是拼写、缺头文件、缺分号、括号不配对
- 把报错那一行单独抄出来,逐字符检查
思路错误
能编译、样例过,但整体方向不对:算法选错、状态设计错误、建模错误。
如何定位
回读题面,手推样例;问自己"这题的本质是什么模型(最值?计数?判定?)"。
修正清单
- 先写暴力,找规律与重复子问题
- 明确状态含义与转移是否有后效性
- 小数据手算验证状态定义
- 对照考点地图确认该用的算法族
考场急救 60 秒
- 回读题面,把「输入 → 求什么」写成一句中文
- 把 n 缩小到 5,手动列所有情况找规律
- 先写暴力拿部分分,别死磕正解
边界错误
n=0/1、空输入、极大值、负数、下标越界、循环起止差一。
如何定位
构造极小与极大两组极端数据;RE 优先查越界与除零。
修正清单
- 数组开大 5~10
- 初始化是否覆盖所有状态
- 二分 / 双指针的 l、r 初值与终止条件
- 多测清空是否彻底
- long long 防溢出
考场急救 60 秒
- 构造 5 组数据:n=1 / 最大 / 全相同 / 全逆序 / 含 0
- 在关键位置打印中间变量,和手算对比
- 检查多测清空、数组大小、long long
常数 / 复杂度错误
算法正确但 TLE / MLE。
如何定位
先算理论复杂度是否超预算,再看 I/O、拷贝、递归深度等常数。
修正清单
- ios::sync_with_stdio(false)
- 大数组改全局 / 滚动数组
- map 改 unordered_map 或离散化
- 递归改迭代防爆栈
- 估算空间:1e7 int ≈ 40MB
考场急救 60 秒
- 数循环层数,对照 n 算操作次数(1 秒 ≈ 1e8)
- cin/cout 关同步,endl 换 "\n"
- map 换 unordered_map,递归改循环
粗心失误
算法没问题,但变量名写错、输出格式错误、多空格少换行。
如何定位
逐字比对输出格式;用 diff 对比样例。
修正清单
- 复制题面输出格式再改
- YES/NO、大小写、多测之间空行
- 提交前跑一遍样例与自建极端数据
考场急救 60 秒
- 对照题面逐字检查输出格式(大小写 / 空格 / 换行)
- 变量名复制粘贴,别手打
- 提交前过一遍自查清单(见下方)
- 编译无 warning,且已开 -O2 与快读
- 样例输入输出逐字符比对通过
- 极端数据:最小 n、最大 n、全相同、逆序、含 0/负数
- 数组空间按最大 n 再放大 5~10
- 可能溢出处统一 long long
- 多组测试数据清空彻底
- 输出格式:空格、换行、大小写、YES/NO
- 文件读写与 freopen 语句(如需)已加
- 时间复杂度重新核算一次,与预算对照
- 空间复杂度估算,确认不超内存限制