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
预处理阶段纯文本替换,分为两类:
- 无参宏:简化成员与函数名,例如
#define F first、#define S second、#define PB push_back、#define MP make_pair。 - 带参宏:简化循环等重复结构,例如
#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》等。
浙公网安备 33010602011771号