
从事算法竞赛和刷题这条路的人大概率绕不开acwing这个名字。我去年到今年一整年主要的刷题时间都耗在这个平台上现在回头看坑踩了不少收益也确实大。这篇文章与其说是分享不如说是我给自己的一个阶段性复盘把我对acwing的认知、课程安排、刷题节奏、周赛打法以及过程中踩过的各种雷一次性写清楚。如果你正打算入坑或者已经刷了一阵子但总觉得效率不高那这篇东西应该能帮你省下不少摸索的时间。1. AcWing的核心价值拆解课程、题库与竞赛生态1.1 课程体系到底怎么选先聊课程。acwing最核心的资产就是那几门课语法基础课、算法基础课、算法提高课还有后面的进阶课以及针对蓝桥杯、CSP、面试的专项课程。很多人一上来就纠结报哪个我的建议是先定位目标。如果你是完全零基础连数组、循环、函数都还不太利索那就从语法基础课开始别跳。这门课用的是C讲的但如果你是Python或Java起步课堂上的思路同样适用只是代码示例需要自己翻译。这里有个很重要的认知acwing整个题解生态都以C为主如果你长期在这上面混C几乎是默认语言。不是说别的语言不行而是你抄作业、看题解、跟直播的时候C的代码最完整踩坑案例也最多用其他语言有时候要自己多做一步转化。如果目标明确是算法竞赛或者大厂笔试那算法基础课是核心中的核心。这门课的内容覆盖了二分、高精度、前缀和与差分、离散化、贪心、DFS、BFS、动态规划、图论基础、数据结构基础基本上国内竞赛入门以及面试中高阶算法题的地基都在这。很多人在校招前突击一两个月其实补的就是这门课的内容。算法提高课则是给已经有一定基础、但感觉做题遇到瓶颈的人准备的。它会深入到更复杂的状态压缩DP、树形DP、网络流、高级数据结构等。我个人的感受是基础课能不能啃下来决定了你入不入门提高课能不能跟下来决定了你在大中型比赛里能不能拿到名词。如果你只是应付面试提高课可以按需选章节不需要全刷如果是奔着竞赛去那就老老实实一整轮过一遍。1.2 题库与活动每日一题、周赛、AC币的价值课程之外acwing的题库和机制设计也是很多人持续留下来的原因。题库里的题目编号是延续式的比如第1题是经典的AB越往后难度和综合性越高。这个编号体系最大的好处就是刷题进度可视化你刷到300题、500题翻看列表时那种积累感特别真实比单纯在LeetCode上按标签乱刷要踏实。每日一题是acwing门槛最低的日常训练。每天系统会出一道题难度通常在基础课到提高课之间浮动题解和打卡机制都在同一个闭环里。不要小看这个功能我见过太多人准备比赛准备了一周也没打开过编辑器但每天打卡一道题的人反倒能保持手感和思维活跃度。每日一题本身积累起来也相当可观一年下来300多道题覆盖面其实比某些系统的题单还要广。周赛则是acwing最有竞技氛围的部分。大约每周一次安排在工作日晚上一个多小时时间做3道题节奏紧凑。周赛成绩影响rating积分积分高的人会出现在榜单前面且有一定的实物和虚拟奖励比如会员、AC币、周边等。这个rating机制我重点说一下它不像传统OJ那样只显示你做了多少题而是引入了动态博弈你发挥好坏直接改变排名。这个设计对那些想提升比赛能力的人来说特别合适因为阶段性反馈极其强烈每场比赛能立刻看到自己的水平变化。AC币则是平台内的通用奖励货币参加活动、比赛、打卡都可能获得。它可以用来买题解、换课程折扣甚至兑换实体周边。我自己攒了大半年AC币换过一门专项课程的折扣券虽然折后价格本身也不贵但这个机制让我对平台的粘性提高了很多。说白了平台在给你一种即时回报感这对长期学习非常有帮助。2. 刷题路线设计如何从零开始没有废操作2.1 按课刷还是按标签刷我的路线演进acwing有一个很大的特点课程讲完一个知识点会配套对应的习题。这个顺序设计其实比很多人想象中要科学。你如果按照课程的顺序刷每个知识块都会有“讲解-例题-作业题”的完整链路知识点之间的联系是逐步建立起来的。但很多人一上来就喜欢干另一件事——按标签乱刷今天二分做三道明天图论做三道后天又回头做字符串。你猜结果如何我实测过效率极低因为知识结构是跳跃的刚建立的思路还没有形成记忆就被你强行切换到另一套思路上了。我的建议是前中期严格按课刷。比如学完二分就把课程里配套的二分习题全部做完再做几道题库里同样是二分标签的经典题。这时候你的思维是聚焦的做的题越多对这种算法的“手感”就越深。等到了后期系统的刷题已经有几百道底子你再回头按标签刷或者按比赛频率刷就是个查漏补缺的过程那时候跳跃一点儿反而能帮你发现薄弱点。具体节奏上我给个比较通用的安排每天至少1道题保底周末空出一整块时间集中攻一个专题。别贪多一天做5道没消化的题不如一天吃透1道题。acwing题解区讨论往往非常活跃一道中等难度题会有多种解法你看完别人的思路再回头不看代码自己写一遍比闷头做三题都管用。2.2 每日一题的正确用法每日一题很多人只是当任务打卡但实际上它的用法可以更灵活。我的操作是看到题目后先自己思考5分钟写出初步思路如果能有代码就直接写完并想清楚复杂度如果卡住了就去看题解但只看标题层级的信息不看具体代码然后自己尝试推导实现。这样训的是“在有限提示下解决问题”的能力跟比赛环境很像。还有一点容易被忽略每日一题的题解经常会把题目和某个课程章节做关联。你如果发现今天的题不会做看完题解之后一定要回到对应课程里重新看那个知识点的讲解视频找出卡住你的到底是什么概念。很多时候你以为自己是不会做这道题其实是相应章节的基础概念没吃透只是那道题没踩到你薄弱的地方而每日一题帮你踩到了。这种“借题补课”的方式是我觉得最能利用好每日一题的地方。注意不要让每日一题的难度打击到你自己。它会不定期放出一道提高课难度的题你基础阶段做不出来太正常了。不要把打卡断掉哪怕只是读完题解弄懂思路也算完成了当天的算法摄入。真正的连续性比完美主义重要得多。2.3 周赛的投入与回报判断周赛到底要不要参加我的回答是能参加就参加。即使你没系统学完课程、很多题完全写不出来我也建议报名。因为你必须尽早体会“限时做新题”的压力感这和平时做作业题是完全不同的状态。平时你可以想半小时调十分钟比赛里你必须在二十几分钟内稳准狠地拿下前两道否则排名就会掉得很难看。我参加过多次周赛大概从开始跟周赛之后我的做题速度和正确率才开始同步提升。这里分享一个心得周赛的复盘比比赛本身更重要。赛后第一时间看三道题的题解把没做出来的题重新独立写一遍然后再过几天、一两周之后回头再重写这题。重复做错题比做新题带来的提升更大。我在后面第3章会详细展开我的复盘流程。周赛奖励上名次靠前有AC币、会员、实物奖励。但我要提醒你别为了奖励去打周赛一定要为了发现自己的问题去打。因为周赛rating浮动的心理波动特别大如果心态不稳名次忽高忽低很容易让人产生自我怀疑。我后期基本上只关注自己的解题速度是否符合目标不再过度关注名次反而心态稳定了很多。3. 完整实操我是怎么做一次acwing复盘3.1 复盘的前置准备题单整理和状态记录我每次复盘都不是临时起意而是提前有信息整理。具体的做法是在题库里给做过的题打标记给没做出来的题添加“再刷”标签然后定期把“再刷”标签下的题导出来整理成一份补刷清单。这个过程没有特别高级的工具就是一个在线表格按题型、难度、首次做的时间、是否再次AC来做记录。表头大概长这样题目编号知识点首次状态复盘次数最终掌握程度备注102前缀和未AC2熟练边界写错过注意l/r细节850最短路TLE1理解要用堆优化Dijkstra1233状态压缩DP未AC3需再刷状态转移没想清楚这个表是给我自己看的不是给别人看的所以越诚实越好。很多人口头说“我在复盘”但其实只是把错题看了一遍并没有真正转化为能力增长。你要给每道题规定一个“再次独立做出来”的标准这才是复盘完成的唯一标志。复盘的时间安排上我习惯每周挑一个固定时段比如周日晚上把本周所有WA、TLE、没思路的题统一拿出来。周赛刚结束的当天适合写代码和重新做因为思路还热而周日的复盘更偏宏观做的是“分类”和“总结”。这两件事要分开不然很容易在细节里迷失方向。3.2 逐题复盘模板说明题意、计算复杂度、一题多解逐题复盘我有一套固定的模板写在自己的笔记里。模板分为四步我按这个顺序写题目本质一句话说明这道题在考什么比如“区间合并的贪心实现”“状态压缩DP的滚动数组优化”。这步不能省它直接决定你对题目类型的判断力。复杂度卡点明确这道题的输入范围上限确认算法必须在什么复杂度内完成。这是做题的第一步很多人一上来就写代码写完才发现超时白白浪费时间。解题思路还原先不看题解凭记忆写出自己的思考过程。如果卡住去翻题解但只读核心思路然后自己补全细节再用自己的语言写一遍完整推导。多解法对比去看题解区里除标准解法外的其他做法思考有没有更优雅的、更贴合当前状态的做法。比如一道题用二分能做但尺取法更优这种思路对比非常培养题感。写到这里很多人会问复盘花了这么长时间值得吗我的体验是绝对值得。整体算下来如果一道题学完需要40分钟那么复盘它通常需要1到2小时但你收获的深度可能抵得上新做三道题。尤其是中等偏难的数据结构和DP题你多做一遍等于把那条思维路径又走了一遍下次遇到同类题时调用速度会快一大截。3.3 周赛复盘的特殊动作榜单分析和重写周赛复盘和普通题目复盘有一个很大的不同你还要分析比赛中时间分配的失败点。我一般会把比赛中每一题的“读题时间、第一次写代码时间、第一次提交时间、卡住时间”都记录下来。比如某场比赛我第一题花了12分钟但还没AC可这题正常情况下应该在10分钟内解决。那我复盘的重点就是这12分钟浪费在哪了是读题慢还是边界情况想复杂了还是没有第一时间联想到某个模板。榜单分析则是看那些rating前排的选手在这一场比赛里的表现。不需要分析所有人就看排在你前面十名左右的那几个人他们第一题大概几分钟提交的第二题、第三题分别用了多久。这个差距就是你的参考系。有时候一看就明白了问题不是知识不够而是整体节奏慢了那就要练模拟赛的手速。周赛重写有个小技巧不要当天立刻重写全部错题因为当时记忆太新鲜容易背答案。更稳的做法是第二天再来隔一天之后你依然能独立写出来那才算真的吸收。如果隔一天写不出说明这个知识点还没稳定要回到对应课程再补基础。4. 常见问题排查与心态避坑实录4.1 提交报错与调试三板斧写对拍、看边界、查溢出刷acwing的过程中最常见的几类提交报错无非是WA、TLE、RE。WA一般是逻辑错误TLE是复杂度太高或死循环RE通常是数组越界或栈溢出。报错本身并不可怕真正让新手崩溃的是“明明本地运行正常交到OJ上就挂”。这类问题我总结了一套排查顺序先看数据范围有没有超int范围。acwing上的题经常给到10^9甚至10^18的边界你的变量类型是int还是long long直接决定WA还是AC。我因为int溢出翻车不下十次后来养成习惯——看到范围大于2*10^9的题第一反应就是开long long。再看数组开得够不够。链式前向星存图的话每条边都要开两倍以上空间DP数组的状态维度有没有全都覆盖到并查集的数组有没有开成题目要求的节点数加一个偏移量AC自动机这类还要考虑节点总数的上限。数组开小了本地小数据测不出来OJ上一跑就RE而且报错信息往往不明显非常折磨人。如果前两步没问题那就可以上对拍。这个方法我说过很多次但它是真的有效写一个暴力解法再拿一个待验证的高效解法随机生成小规模数据用脚本不断跑两个程序输出不一致的地方就是bug所在。下面是一段最简单的bash对拍脚本运行方式很简单三个可执行文件分别是数据和两个程序每次有差异就会输出对应的输入数据#!/bin/bash for i in $(seq 1 10000); do python gen.py in.txt ./std.exe in.txt out_std.txt ./sol.exe in.txt out_sol.txt if ! diff -q out_std.txt out_sol.txt /dev/null; then echo WA on test $i cat in.txt break fi done对拍的核心思想就是把“靠感觉找错”变成“自动化找错”它能够在一分钟内给你制造几十个测试用例比你手动造数据要全面得多。我强烈建议每个认真刷acwing的人都给自己配一个对拍模板特别是遇到贪心和DP题对拍的纠错能力极其强大。4.2 本地能过但提交超时的典型原因TLE是acwing新手另一个重灾区。很多人说“我本地一秒就跑出来了怎么提交就TLE”通常原因有三第一是复杂度本身超了只是你本机的数据比较小感觉不出来第二是使用了过慢的输入输出方式比如频繁用cin/cout且没关同步第三是死循环或者队列没有pop干净。第一种情况最本质解决办法是写代码前先算复杂度。二分O(logN)、前缀和O(N)、排序O(NlogN)、DP O(N^2)这些复杂度要与题目范围匹配。比如N是10^5你用O(N^2)的算法极限数据下必挂。acwing很多题卡的就是这个设计——让你知道该用哪种数据结构和思路而不是让你暴力跑。第二种情况是细节问题但坑人无数。C选手如果你用cin读大数组记得加上ios::sync_with_stdio(false); cin.tie(0);不加的话大数据输入就能把一个本该AC的题拖到TLE。如果数据量再大一些甚至建议直接用scanf/printf或者自己写快读。第三种情况通常多发于BFS和Dijkstra这类依赖队列的算法。队列节点要标记已经访问并避免重复入队如果忘记标记或者标记时机不对可能导致同一个节点反复处理实际运行时间指数级增长。遇到TLE时先找到你最核心的循环或队列确认一下是不是有重复计算。4.3 学习节奏上的三个坑心态和节奏问题比技术问题重要得多我觉得值得单独列一节。第一个坑是“收藏即掌握”。acwing里容易让人产生这种幻觉因为题解的排版很精美、评论区大佬的解法又多又巧妙你看了觉得“我懂了”于是不去动手写。但实际上看懂别人的解法和你自己能写出来是两码事。我见过太多人点开题解看完大呼妙啊然后过了两天还是写不出来。解决的办法就一条合上题解自己从头写有报错就一个个排写不出来说明还没懂再回去看。第二个坑是“进度焦虑”。总有人觉得自己刷了200题还打不过周赛前排再看别人动辄1000题就开始心态崩。但你要知道刷题质量远大于数量。acwing上500道有效题吃透比2000道泛刷一遍要强得多。我的标准是一道题要能不看题解独立AC才算真正刷过如果只是看过答案复制粘贴那它仍然欠在知识账上。第三个坑是“逃避专题”。每个人都有自己的弱项板块比如字符串、数论、斜率优化DP一旦遇到不会的第一反应是跳过去做自己擅长的题。这个行为特别危险因为acwing提高课恰恰是越到后面越难、越需要啃硬骨头。我的建议是每周固定安排一天专门啃最不会的那个板块哪怕一天只吃透一道难题也比做十道舒适区的题更有价值。短板决定你能站到哪一层这个规律在周赛里体现得尤其明显。最后说点大实话复盘acwing这一年我最大的收获其实不是某几个算法的掌握而是一整套面对难题的方法论从读题、算复杂度到设计思路、写代码、调试、再到赛后复盘和对拍验证。这套流程一旦跑顺哪怕换到别的OJ、别的语言、别的比赛底层能力也是通用的。如果你能看到这篇文章我真心建议你把acwing当做一个系统去学而不是一个题库去刷。课程、每日一题、周赛、题解区这四个部分配合起来才是一个完整闭环缺一个都会少很多效果。最后再分享一个让我受益最多的小技巧每次对完答案后花十分钟把这道题涉及的核心思路讲给自己听一遍相当于教会一个虚拟学员这个过程比单纯看解析记得牢太多。你要是有自己的复盘习惯也欢迎在评论区和大家分享算法这条路彼此照看会走得远一些。