ICPC lesson00-01:工作流与输入输出
1.要点:
- 输入形态
- 溢出
- 输出
- 调试
2.核心清单
- 多组输入:给了 T;或没有 T 但每行一个用例;或读到 EOF
- 数值范围:
int/long long;乘法前先转long long - 输出:空格/换行/精度(
printf("%.10f\n", x)) - 调试:本地样例、随机对拍
2.1 输入形态识别(读题 30 秒)
- 是否有
t?(第一行给用例数) - 是否“读到 EOF”?(题面写:until end of file / multiple test cases without t)
- 是否每个用例里有变长数据?(例如给
n后跟n个数;或给一个字符串) - 是否有空行/多余空格?(一般
cin >>会自动跳过空白,getline不会)
2.2 数值范围与溢出
- CF 里只要看见
级别并且有“求和/乘积/前缀”就默认 long long。 - 乘法取模时务必先转 64 位:
(a % MOD) * (b % MOD) % MOD中a、b先转long long。 - INF 习惯:
const long long INF = (1LL<<62);(避免加法溢出)
2.3 输出格式
- 每个用例一行:大部分 CF 都是这样。
- 精度:题面写
absolute/relative error才需要fixed << setprecision(k)。 - 末尾空格一般不影响,但换行缺失常 WA。
3. C++模版
cpp
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int T;
if (!(cin >> T)) return 0;
while (T--) {
// solve one test
}
return 0;
}如果题目没有
T,把int T...换成// while (cin >> ...)形式。
4. 常见输入模板(概念)
- 有 T:循环
T次 - 无 T、读到 EOF:
while (cin >> x) { ... } - 一行字符串:
getline(cin, s)(注意前面是否残留换行)
把这三类再展开一下:
4.1 有 T(最常见)
- 结构:先
cin >> T,再while (T--) solve(); - 每个用例都要把局部变量重新初始化(不要依赖上一个用例残留)
4.2 无 T,读到 EOF
常见于:输入若干行,每行一个用例。
cpp
ll x;
while (cin >> x) {
// process x
}4.3 getline 与空白
如果前面用过 cin >>,再 getline 会吃到残留换行。常见处理:
cpp
string s;
cin >> ws; // 吃掉前导空白
getline(cin, s); // 读整行(不需要记很多技巧:只要记住 cin >> 跳过空白、getline 不跳过。)
5. 练习题单(任选平台)
- 读到 EOF 的统计题
- 多组输入的模拟题
- 大数范围的求和/乘法取模题
在 CF 上练这部分,我练的是:
- Difficulty:800/900
- Tags:implementation / math
- 目标:连续做 10 题,把“读对输入→不溢出→输出格式对”变成肌肉记忆。
6. 形成习惯卡题记录
当做题卡住超过 20~40 分钟:
- 先停下来,做好记录
- 24~72 小时后再二刷一次,把“关键突破点/不变量/边界”补到卡题文件
补充一个非常实用的“卡题分类法”(写卡题时顺手选一类):
- 读题/建模问题:不知道题要你算什么
- 算法选择问题:不知道用二分/贪心/DP/图
- 实现细节问题:边界、溢出、下标、初始化
- 复杂度问题:思路对但 TLE
7. 复盘
- 我最常读错的输入形式:
- 我最常溢出的表达式:
- 我准备在代码里统一做的约定(类型/宏/工具函数):
提交前 15 秒自检:
- [ ] 每个用例是否完全重置变量?
- [ ] 数值是否需要
long long? - [ ]
mid/INF/乘法是否可能溢出? - [ ] 输出是否每个用例换行?