复赛生存指南:文件 I/O 与爆零防范
基础概念
基通俗讲解
复赛用文件输入输出:从 xxx.in 读、向 xxx.out 写(文件名题目给定)。最常见爆零原因不是算法错,而是没写文件读写、文件名拼错、或用了评测环境禁用的特性。本页把"保命清单"一次讲清。
标准文件 I/O 写法
背直接背下
在 main() 开头加两行即可,不要再用 cin/cout 手动重定向:
| 1 | #include <cstdio> |
| 2 | int main() { |
| 3 | freopen("xxx.in", "r", stdin); // 读文件 |
| 4 | freopen("xxx.out", "w", stdout); // 写文件 |
| 5 | // ... 你的代码,照常用 scanf/printf 或 cin/cout ... |
| 6 | fclose(stdin); fclose(stdout); |
| 7 | return 0; |
| 8 | } |
爆零原因清单(逐一排查)
坑考场极易丢分
- CE 编译错误:用了
bits/stdc++.h在部分老环境不支持、或语法写错 → 0 分。本地先用目标编译器(g++)编过。 - 文件名错:
freopen文件名与题目不一致(大小写/后缀)→ 读不到数据,全 WA。 - 数组越界:开
a[100]却访问a[100](下标 0..99)→ RE。 - 爆 int:结果 > 2.1e9 要用
long long,乘法先转1LL*a*b。 - 除零 / 模零:
a%0直接 RE。 - 死循环:
while条件写错 → TLE。 - MLE:数组开
int a[10000][10000]≈ 400MB 超内存。 - 输出格式:多/少空格、换行、用了
%lf输出 double → 判 WA。
评测环境注意
难别踩环境坑
- NOI 系列环境多为 Linux + g++,对未定义行为更严格(本地 Windows 能跑,Linux 可能 RE)。
- 避免依赖特定编译器扩展;
long long用%lld或%I64d视环境。 - 不要
system("pause")、不要交互式输入等待。
梯度自测
基础freopen 写文件的正确姿势?
保命操作。
| 1 | freopen("game.in","r",stdin); freopen("game.out","w",stdout); |
▍解析:答:在 main 开头用 freopen 绑定输入/输出文件,文件名严格照题目。
中档int a=2e9, b=2e9; a*b 会怎样?
爆 int 经典。
| 1 | int a = 2000000000, b = 2000000000; long long c = 1LL * a * b; // 正确:先转 long long 再乘; 错:a*b 以 int 相乘已溢出 |
▍解析:答:直接 a*b 在 int 内相乘已溢出导致错误;必须先用 1LL 提升为 long long 再乘。
记忆口诀
技📌 口诀
"freopen 两行先写上,文件名逐字对题目;越界爆 int 除零死循环,交前本地编译过一遍。"
📝 本节自测共 6 题
做完点「提交本节自测」即时判分;单选 / 多选 / 填空混合,答错可一键收入错题本。
用 freopen 从 data.in 读入数据,正确写法是?
✅ 正确答案:A
读模式用 "r" 重定向标准输入;写输出用 "w" 对 stdout。
若忘记写 freopen 而直接用 cin,复赛结果通常是?
✅ 正确答案:A
评测从文件喂数据,漏写 freopen 就读不到,极易爆零。
为防止数组越界爆零,下列做法正确的是?
✅ 正确答案:A
稳妥起见数组开大一点(如 N+5),避免边界越界。
在 C++ 中,加速读入的常用做法是 ____ 。(填空) 填空题 易
✅ 正确答案:scanf
关同步、scanf、手写快读都能加速 I/O。
下列哪些做法有助于避免“爆零”?(多选) 多选题 中
✅ 正确答案:ABC
文件名、文件读写、多测重置是防爆零三件套。
当 n 达到 10^6 时,cin/cout 不加同步优化可能出现 ____ 。(填空) 填空题 易
✅ 正确答案:TLE
大数据量下 I/O 慢会导致 TLE,需关同步或用 scanf。