错误诊断

先把错误分对类,再谈怎么改

CE / 思路 / 边界 / 复杂度 / 粗心 —— 五类错误的症状、定位方法与修正清单。

症状自检器勾选你遇到的症状,实时推断错误类型
勾选症状后,这里会告诉你最可能的错误类型与急救方案
语法错误 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 秒
  • 对照题面逐字检查输出格式(大小写 / 空格 / 换行)
  • 变量名复制粘贴,别手打
  • 提交前过一遍自查清单(见下方)
提交前自查(10 条)每次交题前过一遍