这是一套面向算法竞赛刚入门Codeforces(CF)选手的全流程实用 *** 教程,核心聚焦「快速搭建合规、提效的竞赛工具链」与「适配CF严苛提交节奏的专属模板打磨」两大痛点:前者涵盖VSC/CLion的CF Helper、编译加速插件,GCC环境配置及本地测试脚本部署;后者包含通用输入输出FIO宏、预调试/禁用调试一键开关、数据类型简化别名等内容,助力选手从基础环节规避低级失误、节约大量时间。
前期准备:搭建你的CF竞赛环境
CF竞赛对代码效率要求较高,C++是绝大多数选手的首选(STL强大、运行速度快),我们先从环境开始搭起。
安装C++编译器:MinGW-w64
Windows用户推荐用MinGW-w64(Linux/macOS自带gcc/g++,可跳过这步):
- 下载地址:MinGW-w64官网(或直接下载预编译包,比如MSYS2更方便)
- 安装后配置环境变量:把MinGW的
bin目录(比如C:\mingw64\bin)加到系统PATH中 - 验证:打开命令行输入
gcc --version,能看到版本号就说明成功了。
选择顺手的编辑器/IDE
新手推荐两种:
- Dev-C++:轻量、无需复杂配置,下载安装就能用,适合快速写简单代码;
- VS Code:更灵活,配合插件体验更好,需安装插件:
C/C++(微软官方插件,提供代码补全、调试)Code Runner(一键运行代码) 配置好后,写代码时就能直接编译运行,无需切到命令行。
核心 *** :打造专属CF竞赛模板
模板的作用是“把重复的事提前做好”——比如输入输出优化、常用宏、基础算法,每次竞赛直接复制就能用,以下是模板的核心模块:
输入输出优化(必加!)数据量大时,cin/cout会比scanf/printf慢很多,所以先加优化:
#include <iostream> #include <vector> #include <algorithm> using namespace std; // 输入输出加速 #define ios_fast ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
如果还想更快,可以写“快读快写”函数(适合极端大数据量):
// 快读:读入整数
inline int read() {
int x = 0, f = 1; char ch = getchar();
while (ch < '0' || ch > '9') { if (ch == '-') f = -1; ch = getchar(); }
while (ch >= '0' && ch <= '9') { x = x * 10 + ch - '0'; ch = getchar(); }
return x * f;
}
// 快写:输出整数
inline void write(int x) {
if (x < 0) { putchar('-'); x = -x; }
if (x > 9) write(x / 10);
putchar(x % 10 + '0');
}
常用宏定义(简化代码)
用宏代替长代码,能少敲很多字:
// 类型简化 #define ll long long #define pii pair<int, int> #define pll pair<ll, ll> // STL操作简化 #define pb push_back #define mp make_pair #define all(v) v.begin(), v.end() #define sortv(v) sort(all(v)) // 循环简化(rep(i, a, b) 表示i从a到b-1) #define rep(i, a, b) for (int i = a; i < b; i++) #define per(i, a, b) for (int i = b-1; i >= a; i--)
基础算法模板(高频考点)
把CF常考的基础算法提前写好,用时直接调:
- 快速幂(算a^b mod p,时间复杂度O(logb)):
ll qpow(ll a, ll b, ll p) { ll res = 1; while (b) { if (b & 1) res = res * a % p; a = a * a % p; b >>= 1; } return res; } - 更大公约数(GCD):
ll gcd(ll a, ll b) { return b ? gcd(b, a % b) : a; } - 埃氏筛素数(预处理1e5以内的素数):
const int MAXN = 1e5 + 5; bool is_prime[MAXN]; void init_prime() { fill(is_prime, is_prime + MAXN, true); is_prime[0] = is_prime[1] = false; rep(i, 2, MAXN) { if (is_prime[i]) { for (int j = i*2; j < MAXN; j += i) is_prime[j] = false; } } }
把模板整合起来
每次竞赛前,把上面的模块复制到一个文件里,就是你的“初始模板”啦!比如完整的基础模板长这样:
#include <iostream>
#include <vector>
#include <algorithm>
#include <cstring>
using namespace std;
#define ios_fast ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
#define ll long long
#define pii pair<int, int>
#define pb push_back
#define all(v) v.begin(), v.end()
#define rep(i, a, b) for (int i = a; i < b; i++)
ll qpow(ll a, ll b, ll p) { /* 快速幂代码 */ }
ll gcd(ll a, ll b) { /* GCD代码 */ }
int main() {
ios_fast;
// 你的解题代码写在这里
return 0;
}
解题流程 *** :从读题到提交的标准化步骤
有了工具和模板,还要有一套标准化的解题流程,避免慌乱:
题目分析:先抓3个关键点
- 输入输出格式:看清楚是多组测试用例(比如
t组)还是单组?输出要不要换行、空格? - 数据范围:比如
n是1e3还是1e5?如果是1e5,O(n²)的算法肯定超时,得选O(n)或O(nlogn)的; - 时间/空间限制:CF一般时间限制1-2秒,空间256MB,别超了。
算法选型与代码编写
- 先想暴力解法行不行?如果数据范围小,暴力能过就直接写;
- 暴力不行的话,想对应算法(比如排序题用sort,找最值用优先队列,图论题用BFS/DFS);
- 套用模板:比如需要快速幂就直接调
qpow(),需要循环就用rep()。
调试与测试
- 先测样例输入:把题目给的样例复制进去,看输出是否一致;
- 再测边界情况:比如
n=0、n=1、更大数据量,看看有没有bug; - 用
cerr输出中间变量:调试时用cerr不会影响提交后的输出(评测机只看cout)。
提交与反馈
- 提交前检查:有没有忘加
ios_fast?变量名有没有写错? - 看评测结果:
- AC:恭喜!这题过了;
- WA:答案错了,检查边界情况、逻辑错误;
- TLE:超时了,优化算法(比如把O(n²)改成O(nlogn));
- RE:运行错误,可能是数组越界、除以0。
进阶 *** :让你的模板“更强大”
随着刷题增多,你可以不断迭代模板:
- 加进阶算法:比如线段树、Dijkstra最短路、动态规划的背包模板,赛后遇到新算法就整理进去;
- 加调试工具:比如
debug()宏,能输出变量名和值:#define debug(x) cerr << #x << " = " << x << endl;
- 整理错题对应的模板片段:比如某题因为没考虑“模运算”错了,就把模运算的注意事项加到模板注释里。
写在最后
模板是辅助,核心还是算法思维!建议新手从CF的Div.3 A/B题开始刷,慢慢积累经验,每次赛后把新学的东西加到模板里——久而久之,你的专属模板就会成为CF竞赛的“得力助手”。
现在就动手搭环境、写之一个模板,去CF提交你的之一题吧!
