CPH-第一章 算法简介

竞赛编程 = 算法设计 + 算法实现

  • 算法设计:问题分析、数学思维,目标是正确且高效;解法通常是经典套路 + 创造性思路。
  • 算法实现:代码能力,思路对不等于代码能过;竞赛代码追求简短、快速写完,不需要长期维护,风格简洁直接。

1.1 Programming languages

  • 主流竞赛语言:C++ 是竞赛首选(高效、标准库数据结构与算法丰富、几乎所有比赛支持),其次是 Python、Java。
  • 竞赛标准模板:
    • 用 #include <bits/stdc++.h> 万能头(GCC 扩展)一次性引入全部标准库,省去逐个包含头文件。
    • using namespace std; 简化标准库调用。
  • 编译命令:g++ -std=c++11 -O2 -Wall test.cpp -o test,其中 -O2 开启代码优化,-Wall 输出警告信息。

1.2 Input and output

  • 基础读写:cin / cout 处理标准输入输出,数字与字符串读入会自动忽略空格、换行符;也可使用 C 风格 scanf / printf,速度略快但写法更繁琐。
  • IO 性能优化:
    • 开头加入 ios::sync_with_stdio(0); cin.tie(0); 解除 C 标准流同步、解绑 cin 与 cout,大幅提升速度。
    • 优先使用 '\n' 换行,禁止频繁用 endl(每次 endl 都会强制刷新缓冲区,严重拖慢速度)。
  • 常用输入模式:
    • 未知数据量:while (cin >> x) 循环读取直到输入结束。
    • 读取整行:getline(cin, s),注意与 cin 混用时会残留换行符的坑。
  • 文件输入输出:用 freopen 做文件重定向读写。

1.3 Working with numbers

整数类型

  • int:32 位,范围约 \(-2^{31} \sim 2^{31}-1\),是高频溢出点。
  • long long:64 位,范围约 \(-2^{63} \sim 2^{63}-1\),竞赛整数运算首选。
  • __int128:128 位超大整数,但无法直接用 cin/cout 输入输出,部分竞赛环境不支持。
  • 经典陷阱:两个 int 相乘即使赋值给 long long,也会先在 int 范围内运算溢出,需提前强转其中一个数为 long long。

模运算

  • 核心性质:加减乘运算均可先取模再运算,结果不变;常用于答案很大、要求对 \(10^9+7\) 等数取模的场景。
  • 负数处理:C++ 中负数取模结果可能为负,需手动判断后加 m 保证余数在 \(0 \sim m-1\) 范围内。

浮点数

  • 常用类型为 double(64 位),更高精度可用 long double。
  • 精度陷阱:二进制表示浮点数通常存在舍入误差,绝对禁止用 == 直接比较两个浮点数,应通过差值是否小于极小值 eps(通常取 \(10^{-9}\))判断相等。
  • double 可精确表示绝对值不超过 \(2^{53}\) 的所有整数。

1.4 Shortening code

核心目的:减少重复书写、提升编码速度,竞赛代码追求简洁高效,不强调长期可维护性。

typedef 类型别名

给长类型定义短名称,安全无副作用,例如:

typedef long long ll;
typedef vector<int> vi;
typedef pair<int,int> pi;

宏定义 #define

预处理阶段纯文本替换,分为两类:

  1. 无参宏:简化成员与函数名,例如 #define F first、#define S second、#define PB push_back、#define MP make_pair。
  2. 带参宏:简化循环等重复结构,例如 #define REP(i, a, b) for (int i = a; i <= b; i++)。

宏的重大隐患

宏仅做文本替换,没有语法语义检查,极易因运算符优先级产生隐蔽 bug。例如 #define SQ(a) a * a 中 SQ(3 + 3) 会展开为 3 + 3 * 3 + 3,结果错误;正确写法必须加括号:#define SQ(a) (a) * (a)。

1.5 Mathematics

竞赛必备的基础数学概念与公式,是后续算法分析与解题的工具。

  • 求和公式:自然数和、平方和、等差数列、等比数列、调和级数的上界估计。
  • 集合论:交、并、补、差运算;子集数量为 \(2^{|S|}\);常用数集符号(自然数、整数、有理数、实数)。
  • 逻辑基础:与、或、非、蕴含、等价的真值表;全称量词与存在量词;谓词的定义。
  • 常用函数:向下取整 floor(x)、向上取整 ceil(x);阶乘、斐波那契数列的递推定义与比内闭式公式。
  • 对数:基本运算性质;在算法复杂度分析中的意义(二分、分治的步数估计);整数的进制位数计算公式。

1.6 Contests and resources

  • 顶级赛事:
    • IOI(国际信息学奥林匹克):中学生个人赛,各国选拔组队,分两天共 10 小时。
    • ICPC(国际大学生程序设计竞赛):大学生三人组队赛,共用一台电脑,分区域赛与全球总决赛。
  • 在线平台:Codeforces、AtCoder 等周更赛事;Google Code Jam、Facebook Hacker Cup 等企业赛事。
  • 推荐书籍:
    • 竞赛向《Programming Challenges》《Competitive Programming 3》《Looking for a Challenge?》,
    • 通用算法向《Introduction to Algorithm》《 Algorithm Design》《The Algorithm Design Manual》等。
posted @ 2026-10-28 01:18  LifeLotus  阅读(12)  评论(0)    收藏  举报