Skip to content

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 里只要看见 109 级别并且有“求和/乘积/前缀”就默认 long long
  • 乘法取模时务必先转 64 位:(a % MOD) * (b % MOD) % MODab 先转 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/乘法是否可能溢出?
  • [ ] 输出是否每个用例换行?