零基础如何自学 XCPC
# 零基础如何自学 XCPC
如标题,这又是一篇 XCPC 教学贴
声明:本教程适用于弱校零基础 XCPCer,强校的同学们去问教练,oier 根据高中水平不同选择不同的路
何为弱校?
- 学校没有成体系的算法竞赛培训体系,个别学长/学姐自己训练
- 学校进入区域赛的队伍数每年只有一只或两只,且很难获得较高奖项
- 学校不支持 XCPC 类赛事
# 比赛介绍
# XCPC
ICPC ICPC(英文:International Collegiate Programming Contest,中文:国际大学生程序设计竞赛)由 ICPC 基金会(英文:ICPC Foundation)举办,是最具影响力的大学生计算机竞赛。由于以前 ACM 赞助这个竞赛,也有很多人习惯叫它 ACM 竞赛 官网网址:https://icpc.global (opens new window)
CCPC 中国大学生程序设计竞赛。 官网网址:https://ccpc.io (opens new window)
# 赛制介绍
ICPC/ACM 赛制
一般是三个人组成一队使用一台机器,在比赛时有多次提交机会。比赛实时评测并返回结果,如果提交的结果错误会有 20 分钟的罚时,错误次数越多,加罚的时间也越长。每个题目只有在所有数据点全部正确后才能得到分数。比赛排名根据做题数来评判,做题数相同的,根据总用时来评判。总用时是每题用时的和。每题的用时是从比赛开始到做出该题的分钟数与该题的罚时之和。
一些 ICPC 相关赛事中,比赛结束前一小时进行封榜,封榜后的提交和排名将无法被其他选手看见。
在 ICPC 相关赛事中,选手允许带一定量的纸质资料。
# 赛季赛程
- ICPC/CCPC 省赛/邀请赛 (4 月底至 6 月初)
- ICPC/CCPC 网络赛(8 月底至 9 月初)
- ICPC/CCPC 区域赛(9 月底至 11 月底)
- ICPC EC Final/CCPC Final(12 月中旬)
- ICPC World Finals(次年 4 月至 6 月)
# 学习路线
我粗浅得把算法竞赛的学习分成三个阶段,包含了从入门到能达到区域赛银牌的水平,每个阶段有不同的学习侧重点和目标
- 语法阶段
- 基础算法阶段
- 进阶算法阶段
接下来我会分阶段展开讲一讲
大家可以根据学习目标看自己达到了哪个水平,切记切记不要好高骛远
# 语法阶段
推荐时间:一个月 ~ 两个月,不宜拉的过长
# 需要掌握
学会C++基础语法,包括但不限于:输入输出,分支,循环,数组,结构体,函数,指针了解即可
能用代码表达出自己的想法,会做一些模拟题
可以学一学写技术博客,学会 Markdown 语法和 Latex,推荐博客平台:知乎,博客园,csdn(bushi)
学会 IDE 的基本操作,本阶段推荐 Dev-C++,等学到后面可以考虑 vscode 或其他
学会时间复杂度和空间复杂度的估算,了解 OJ 常见报错 WA,TLE,MLE,RE,CE
掌握对拍的方法
掌握一些最最基础的计算机知识,ASCII 码,堆内存与栈内存
可以去了解一些简单的 python 应用
# 知识输入
主要分三个方面,听课,看书,看大佬的博客
这个阶段还是比较推荐看一些付费或者免费的网课的,看书相对来说比较枯燥,可以自己选择,方法不是重要的,重要的要掌握知识点
比较推荐的网课有:
- 牛课竞赛的网课 (opens new window)
- Acwing 语法基础课 (opens new window)
- B站 MuQuanyu 的C/C++ 算法竞赛语法课 (opens new window)
推荐书目:
- 《信息学奥赛一本通》- 董永建 的 第一部分,基础语法
# 刷题
这个阶段不建议大量的刷题,但最基本的刷题量还是要有的
如果你报了网课,那么跟着老师的课后题即可,如果有书,看看书后的课后题,当然自己也可以找一些题来做
# 雷区
- 有些课程会讲到 STL 库,但这部分在此阶段如果觉得难理解可以先跳过,等学了栈,队列等数据结构后自然而然就理解了
- 要养成好的提问习惯,问别的大佬时不要拿出一个题然后一个代码,说哪里错了,应该简化题意,然后说自己的想法,不要问语法问题(出钱询问除外)
# Q & A
- 书后的习题哪里找?
# 算法入门
推荐时间:三个月到一年
这个阶段是成长最快的阶段,需要学习的东西很多
这个阶段基本还是靠知识输入,但是也要加强刷题了,我觉得应该是一半一半,此阶段结束时,至少达到 1000 题的刷题量(水题除外)
# 需要掌握
- 基础算法,和一些经典算法,具体哪些算法可以看书或者看后面有个图,需要做到把书拿走能打出算法模版,能在脑子中想出算法的基本过程
- 开始打一些网络比赛,推荐 codeforces 和 atcoder,至少应该达到 cf 1400 分 at 1200 分的水平,如果觉得很难到达这个水平,应该重新思考一下自己是否适合走算法竞赛这条路,或者方法是否有问题
应该掌握 青色(入门),绿色(铜牌)的算法
# 知识输入
和上阶段类似,如何学算法:看课 + 看书 + 找大佬的博客看
如果看书看的进去,认准一本书,若有哪个算法书上看了好几次都看不懂的,就去google 搜博客看或者 B 站找视频理解看,看完之后,找书后的题单,把例题和习题全部做了,做不来的上网搜题解,写完后自己写博客总结
比较推荐的书目如下:
- 《信息学奥赛一本通》- 董永建 的后面部分,这本书依旧非常经典
- 《挑战程序设计竞赛》这套书的 1 和 2 不是递进关系,感兴趣可以先看 2,然后挑 1 的某些章节看,对于此阶段来说,2 比 1 要重要点,国外的书启发性非常好
- 《算法训练营》新出的一本书,非常生动形象的图解算法
- 《算法竞赛从入门到进阶》(罗勇军, 郭卫斌) 经典黑书,但是本人不是很推荐,初学者容易读蒙,对自己比较自信且学习能力强追求速成的可以考虑黑书
当然如果报了课的,课后老师会给题单,把老师的题写了,要注意一下看课容易陷入一种自己已经懂了但没有懂的境界,需要把课关掉,拿出一张白纸,然后自己推一次
比较推荐的网课如下:
付费的和收费的都有,就目前来看,付费的课程要系统一些,B 站免费的课程在个别知识点上讲的不错
- 牛课算法入门班 (opens new window) 真的不是推销,确实还不错
- SDU-ACM (opens new window) 山大的ACM新生集训不错
- CUIT-ACM算法竞赛实验室 (opens new window) 成都信息工程大学,B站较为系统的课程
- 钉耙编程-刘春英老师 (opens new window) 杭电刘春英老师,算法入门系列不错,就是难度把握的不是很有梯度,容易讲超了
一个算法不要卡太久,大约一周要完成一个算法,如果觉得题很多,那也没必要全部刷完,刷到什么程度ok,就是达到把显示器关掉能打出算法的核心代码(默写算法过程)
对于前面留下的 STL 算法,应该在这个时候补齐
# 刷题
这个阶段的刷题除了上面提到的针对学的算法的刷题还需要打一些网络赛
网络赛和刷题是完全不同的节奏,缺一不可
现在能打的网络赛:
codeforces 的 div3,div4,有能力的可以打 div2,cf 的风格比较偏向于近年来的区域赛签到题,cf 分数来业内也是硬通货,强烈要求打
CodeForce使用说明超详细!!!!! (opens new window) 使用油猴插件 codeforse better 可以翻译英文题面,用法自行百度
atcoder 的 atcoder beginer contest,简称 abc,atcoder abc 的题目都是非常非常经典的模版题,适合新手打,如果赛场上除了一个很经典的题但是你没做过就会很亏,基本奠定了此场比赛的结束
AtCoder从小白到大神的进阶攻略 (opens new window)同理,使用油猴插件 atcoder better 可以翻译英文题面,用法自行百度
牛课竞赛的算法周赛,小白月赛,这个的好处就是牛课竞赛的 B 站账号都会有人讲解,而且可以进群问问题,对小白比较友好,但是小白月赛的前几题通常比较烦,个人不是很喜欢,但锻炼基本功
打完比赛后一定一定要补题!!!
对于不会做的题,看题解把题搞懂,已经做出来的题,也去扫一眼题解,看一下 jiangly 代码,往往有非常优雅的解法
打完比赛之后如何补题?B 站搜这个比赛名称视频,有很多更新的佬,或者去google或者知乎搜题解,或者群里问,一般刚刚结束的比赛大家都在补,看到会回答的,英语水平比较好的可以直接看 cf 和 at 的官方题解,at 的官方题解往往写得非常好
补到什么程度?一般补到自己没做出来的那一题的下一题,比如说我卡在第 3 题了,我可以把第 3 题补了,然后再看一下第 4 题有没有想法
补题遇到自己不会的算法了怎么办?看上面那个图,如果是铜牌要求一下可以顺便把这个算法学了,如果过难不建议学,会耗费大量时间并拖慢主线任务
# 雷区
- 这个阶段不建议不建议去钻研非常非常高深的算法,见过有学生刚开始数论就开始莫比乌斯反演
- 不要看着 oi-wiki 学习,这个网站更像一个字典,不可能拿着字典学习吧,应该学完后整理时用的
- 不要去看黑书:算法导论,除非你是天才,不是说黑书不好,而是里面包含一些证明过程,第一次学没有必要细扣,想知道了日后过来看也不持,和 oi - wiki 同理
# Q & A
- 书本后面的题单在哪里找?
vjudge (opens new window) vjudge 的题单,里面有很多大佬整理的题单,也有书本后面的习题
Virtual Judge使用指南 (opens new window)
- 比赛很多打不完怎么办?
# 算法进阶
这个时候就不太建议使用 dev-C++ 了,可以看一下区域赛的网络配置,使用 vscode + ubuntu 进行训练
# 需要掌握
- 掌握至少一个方向的金牌以下的算法,自己感兴趣的方向银牌算法
- 有志同道合的队友
- cf 分数至少到 1900,努力往2100冲
这个阶段,对算法训练有自己的理解,并能自己指定计划了,接下来是我给的一些建议,仅供参考
# 知识输入
这个阶段的知识输入应该减少,需要大量刷题锻炼思维,然后通过题来补充自己的算法漏洞
组队后和队友分方向,例如:动态规划,图论,字符串,计算几何,然后深耕这个方向,其他方向了解即可
很多书上没有到达这个难度,需要看一些大佬博客或者B站搜这个算法学习,由于这个阶段的算法难度较大,只要做到带板子把题能做出来即可。
这个看一下这个大佬的方法:知乎 cup-pyy 又一篇算法竞赛阶段总结和经验分享 (opens new window)
# 刷题
刷题分为两个方面:组队训练和个人训练
个人训练不建议刷板子题,还是冲 codeforces , atcoder 和牛课
如果自己日常想刷题:找自己 cf 分 + 300 左右的 rating,进行板刷,当觉得简单调高 rating,觉得难减少 rating,不要找太难或者太简单的题做,没有意义
组队训练的话,可以 vp:
- 近三年 ICPC/CCPC 省赛,邀请赛,区域赛,在gym上或者 QOJ即可 XCPC补题题单 (opens new window)
- Universal Cup 的题目
- 牛课的多校
- 杭电多校
组队完一起补题,建议补到金牌题以下
大致学习思路是:刷题 补题 查漏补缺找到不会的算法 把算法学了 找几道相关的题目再练练手
赛后一定一定一定要记得补题,补题的重要性远远大于做新的题
可以看一些与算法没有直接相关,但是能给人很多启发的书
- 《算法导论》 经典中的经典,可以选章节选读
- 《具体数学》 非常有意思的书,相信你读了就会爱上的
- 《博弈论》
- 《oi国家历年集训队论文》github 上能搜到,但是不建议每篇文章都读,挑感兴趣得看
# 雷区
- 少水群多训练,适当水群有利于身心健康,沉迷水群荒废训练
书目获取链接:https://pan.baidu.com/s/1-0wB2Q8T_8cDxdNMZoOTXg (opens new window),密码:rt5m