1. 项目概述
"OJ 学习笔记 Day3"这个标题看似简单,但背后蕴含着算法竞赛选手的日常训练体系。作为参加过多年ACM/ICPC的老兵,我深知系统化的OJ(Online Judge)训练对于提升编程和算法能力的重要性。Day3意味着这是一个连续学习计划的第三天记录,通常包含当日刷题总结、新学算法归纳和典型错误分析。
这类学习笔记的价值在于:它不仅是个人成长记录,更能为其他学习者提供可复现的训练路径。通过拆解每日的刷题过程,我们可以建立起从问题分析、算法选择到代码实现的完整思维链条。
2. 训练系统搭建
2.1 OJ平台选择
主流OJ平台各有特点:
- LeetCode:适合准备技术面试,题目偏向实际工程场景
- Codeforces:比赛频率高,题目强调算法思维和编码速度
- AtCoder:题目质量极高,特别适合培养数学建模能力
- 洛谷:中文界面友好,适合初学者过渡
我建议选择1-2个平台专注刷题。以Day3笔记为例,如果前两日都在Codeforces刷动态规划题,第三天可以继续在该平台选择难度递增的DP题目,保持训练连贯性。
2.2 开发环境配置
高效的本地调试环境能节省大量时间:
bash复制# 推荐工具链组合
code runner + 自定义测试脚本
Competitive Companion(浏览器插件快速抓题)
cf-tool(Codeforces专用命令行工具)
重要提示:一定要配置一键测试功能,能够自动运行样例输入并比对输出。手动复制粘贴测试数据会严重拖慢训练节奏。
3. 典型训练日记录
3.1 题目分析过程
以Codeforces 1623C题为例,展示完整的解题日志:
-
题意理解(15分钟)
- 先通读英文描述2遍,画出问题示意图
- 用自己语言重述问题要求
- 枚举所有边界条件(n=1, h[i]=0等)
-
算法设计(30分钟)
- 识别出这是二分答案+贪心验证的复合题型
- 设计check函数:从后向前处理石头分配
- 证明贪心策略的正确性
-
编码实现(45分钟)
- 先写框架:二分主循环+check函数
- 特别注意数组下标的边界处理
- 添加详细的调试输出
3.2 常见错误类型
Day3笔记中应该记录当日遇到的典型bug:
- 整数溢出:没开long long导致大数计算错误
- 边界条件:没有考虑n=1的特殊情况
- 时间复杂度:错误估计了嵌套循环的复杂度
- STL误用:错误使用lower_bound导致WA
建议为每类错误建立代码片段库,比如:
cpp复制// 防溢出检查清单
#define int long long
const int INF = 1e18;
a = min(a, b); // 代替 if(b<a)a=b;
4. 算法专项突破
4.1 当日重点算法
假设Day3重点学习的是滑动窗口,笔记应该包含:
- 基本模板代码
- 变种题型对比(固定窗口vs可变窗口)
- 相关题目链接:
- LeetCode 3, 76, 209
- Codeforces 702C
cpp复制// 固定窗口模板
int left = 0, ans = 0;
for(int right=0; right<n; ++right){
// 处理新元素
while(窗口不满足条件){
// 移动左边界
left++;
}
ans = max(ans, right-left+1);
}
4.2 复杂度分析技巧
记录不同实现方式的时间对比:
- 暴力解法:O(n^2)
- 滑动窗口:O(n)
- 前缀和+二分:O(nlogn)
用实际数据测试:
python复制n = 1e5
print(n**2) # 100亿次操作 → TLE
print(n*log2(n)) # 约166万次 → AC
5. 训练方法论
5.1 题目选择策略
推荐采用主题式刷题法:
- 确定本周重点(如动态规划)
- 按难度梯度选择题目:
- 基础:斐波那契、爬楼梯
- 进阶:背包问题、LCS
- 挑战:状压DP、数位DP
- 每个子类型做3-5题直至掌握
5.2 调试技巧汇编
Day3笔记应该积累这些实用技巧:
- 对拍测试:写暴力程序与优化程序对比输出
- 数据生成器:用随机数生成边界测试用例
- 调试宏:
cpp复制#define debug(x) cerr<<#x<<"="<<x<<endl
void __print(int x) {cerr << x;}
6. 学习进度管理
6.1 知识体系构建
建议用脑图记录知识网络:
code复制算法体系
├── 基础算法
│ ├── 排序
│ └── 二分
├── 数据结构
│ ├── 线段树
│ └── 并查集
└── 动态规划
├── 线性DP
└── 树形DP
6.2 错题本管理
有效的错题记录应包含:
- 错误代码片段
- 错误原因分析
- 正确解法
- 同类题目链接
推荐用Git管理代码版本,每个WA提交都写commit message说明错误原因。
7. 实战经验分享
7.1 比赛策略
从Day3开始培养这些习惯:
- 先读所有题目,标记难度预估
- 从最简单的题目开始做
- 30分钟没思路就换题
- 最后1小时专注调试而非开新题
7.2 心理调节
记录训练中的心态变化:
- 遇到连WA时:喝杯水,散步5分钟
- 题目太难时:先看简单题的正确提交找信心
- 疲劳时:做20分钟简单题保持手感
我个人的经验是,持续记录训练日志的选手,三个月后的进步速度是不做记录者的2-3倍。Day3可能还看不到明显效果,但坚持到Day30时,你会发现自己已经建立了完整的算法思维体系。