信息学如何做题,怎样更加高效的训练?

提升代码水平

Pro Tips — get them while they are free

How to practice Competitive Programming [Um_nik version]

一道题该怎么做,平时训练怎么做,做题步骤是怎样的。

看一道题

拿到一道题我们不要想着跳着读,不要想着省时间粗略的读,要有捕获关键信息的能力,如果忽略题目关键或隐藏的信息会给后面的做题带来很惨重的后果。如果一段话没有出现数学语言或不是关键的语言可以跳过。关键语言要一字一句的读。尤其是题目陈述很关键的条件,比赛几个小时不差读题几分钟。如果读错题之后的事情非常不好办。找到题目的关键信息,题目的条件、数据范围特殊性质了都然于心,看完题可以在顺便回顾一遍,这道题有什么特殊的地方。

想题

从前面读题中找到题目的关键条件、性质开始去做这个题,有逻辑的寻找题目的突破口,而不是到处乱跳任凭思维的缰绳到处飞跃,就相当于在思维的地图找到一个点,随机找肯定不行,脑子中抛出很多想法, 要有逻辑的思考,不要任凭自己的直觉,准的还好,不准的就麻烦了。

有逻辑地思考,从题目中提取关键信息,直接枚举做法

不会不要慌,不要一下子想着就能做出题目,题目的很多性质,要慢慢一个个挖掘出来。尝试多种思路、方向,有的题目关键性质藏的很隐蔽,不符合我们的第一第二直觉,不要觉得题目就应该用什么算法或者就应该用什么数据结构来做,如果尝试一个思路行不通不知道怎么做,就应该立马换一个思路,不要纠结在一个死胡同中。如果DP不行就换成贪心,容斥,枚举,一个一个思路枚举,把脑海中的小技巧都便利一遍,找到合适的。
很多同学一开始尝试一个两个思路行不通,做不出来,就去看题解,这是大忌;要一直尝试所有的思路直到黔驴技穷再看题解,信息学中独立思考深入思考能力的重要性,少看题解多自己动脑想,自己独立做出来写出代码AC的题目和看题解告诉你怎么做似懂非懂自己代码都不实现的效果是不一样的,反复思考的极端重要性。

善于简化问题

  • 缩小数据范围,多次询问改成单次询问
  • 图不会做,那么久简化成树链,图-树-链。
  • 数多少个合法方案不会做就简化成判断一个方案是否合法。
    尝试做一个简化,解决一个化简的问题,可能会发现适用原问题的关键性质。OI题,对着部分分来挖掘性质做,CF自己编部分分弱化条件,得到启发,实在不行,手摸一下小样例,博弈题,给出方法和过程,进来是否合法,通过模拟一下样例的过程更加了解问题的结构。不要只顾着机械的计算,NOIP考场上只会模拟样例也不行。在计算的同时停下来观察思考模拟的过程,思考博弈的性质,最优化长得非常像贪心或者DP之类的。
    也可以打表找规律,千万不要在自己尝试所有办法之前看题解。
    题目错综复杂,可以在纸张电脑上记录下来,还是不会做,再重新读题,很常见,在题目没有读好的时候经常发生。

想出做法

很多同学想出题目的做法可能会很兴奋,就想直接rush写出来,保持冷静,把思路彻底捋清楚,think twice, code once。比如DP的状态,转移的设计需要把所有的细节想清楚再写。
数据结构题,分好几个板块,每个版块怎么做版块之间怎么整合起来。对于某一个难写的地方,怎么好写。有时候我们会做一个题,但是做法比较麻烦,但是如果稍微继续深入参考挖掘一下develop一下变成简单做法,心急没有想,直接写写不出来,调试不出来,或常数太大,再深入发展一下这个做法变得更好写常数更小些。
真实打比赛的时候,部分分,可以一档一档部分分的想,想完部分分的时候正解的思路往往也会涌现出来,定制比赛策略,策略可以灵活调整,怎么选择写哪一个部分分,预估写每一档部分分的时间和分值比对,在纸上罗列下来,冷静下来相信自己的直觉第一判断。分值比对,选定一个性价比最高当前的性价比最高最优策略,坚定的执行它,不要踌躇不前犹犹豫豫。CF没有部分分的比赛,到底写多少写哪个比较好。比赛技巧

写代码

每时每刻保持专注状态,写代码是机械化的过程,写着写着就变成像刷牙一样变成自动挡,下意识的在那里写,很容易写出很离谱的错误,无意识写代码变成专注的写代码,在比赛中太紧张压力太大,压力扰乱写代码,最好就是放松且专注的写代码。
写代码非常常用的技巧:非常难写的部分先用暴力部分暴力写出来,写出一部分暴力之后只剩一部分暴力,拿样例测出来,改成想要实现的东西。信心大增,暴力-》正解,小暴力-高分暴力,暴力过样例再改成正解,获得启发,想出更好写的写法更优秀的实现方式。只会一个题的暴力。直接想正解,先写暴力。写着写着原来还可以这么些,没有想到的地方通往正解的一个突破口。

调代码

冷静下来,不要绝望着做无意义的输出调试。在你以为很容易写错的地方,其实出错的概率不大,在完全没有想到的地方出错,在容易出错的地方写代码实现的地方小心,比较容易的地方更容易进入刷牙的自动挡里,未曾涉足想到的会出错的地方。写一份代码停下来,瞪眼调试,尤其是专注度比较低的时候,先看一下有没有出错。实在调不出来,对拍,不要随机数据,要造一些更强的数据。对拍,直接随会挂分。

做出来了

不要直接关掉这个题,先反思,什么地方花了我太久,本应该很快想到但是很久才想到这个点。本来以为写代码很快但是花了太久,看一下别人的代码题解思路。这个题值得用文字记录的地方,写题解博客是一个很好的习惯。价值没那么高的不用记录,记录关键有用的信息。

先把CCF 官方的题做掉,做题的价值最高,拟合可能会出什么样的题。atcoder Codeforces JOI JOISC
全真模拟官方真题
pjudge.ac

做模拟赛,全真的比赛环境,打任何比赛都有帮助,atcoder cf都有帮助。
网上各国的OI 比赛,自觉,VP 一场比赛,不要寻求外界的帮助,坚持到底,不要中途放弃,锻炼好比赛的心态。模拟赛有不部分分,考场合理时刻写部分分,临场设计策略问题。
费尽心思的部分分。任意拿一套题过来,想每个题的部分分,预估写多久。看得到的分能不能达到预知的效果。

最大最有效的方式:考NOIP 多经历惨痛的事情适合比赛的策略。多磨练自己。比赛心态,真刀实枪,好好刷题。

信息闭塞:关注知名活跃的竞赛选手,还有比赛,还有这个题,多参与社群的讨论,获得更多的信息。UOJ 的群,比较活跃的竞赛的讨论的群,获得算法竞赛信息,如果有问题,大胆私聊。多关注博客

挑些题打印出来,非常好非常详尽。
博客打印带到学校去看。
利用文化课的空余时间,不想听,偷偷的想一道题,看打印材料,作业不想写,混水摸鱼。

两天一场模拟赛,atcoder CF第二天补题

提高思维能力,独立积极思考,在用尽一切方法前不要看题解。

一直抄题解还不如想出来两三道题来的提升快。

初二暑假杭二训练,一道题想几个小时几天,实在不会的情况下再去看题解,如果你做了一个题看了题解。不会记住,自己想出来的做法印象深刻,尝试各种方法做一道题的时候,所有失败和成功对方法更深刻,不能做某一个题有更好的感知,即使没有想出来也有提升。看题解肌肉的动作,锻炼肌肉的过程在自己做题的过程中。思考的时候一定要有自信,别人觉得难很难。不要退缩,确实做不出俩。

天赋:开始学OI 的时候,中等水平,学的没意思,不想学,坚持下来。AGC 看天赋,思维能力的肌肉被锻炼的多大多结实。需要用多大的努力时间培养良好的思维习惯,只要一个人能够全神贯注思考足够就,达到足够高的水平。停一段时间NOIP 前高一入学前,不要全天听,有必要的文化课停。高代,OI 中的数学组合数学,题单arc agc abc JOI JOISC USACO CF div1 div2,针对性的刷题,CF tag filter,CDQ 分治的题单,识别出算法的过程,杂题。
比赛前调整心态:不要期待自己一定要怎样,题目的难度无法控制的,放低期待。

比赛本身:看待比赛比较重,关系升学上什么大学,它可能没有我们想象的那么重要,OI 只是人生经历的很小一部分。只顾着自己的学习,和OI 同样的重要的是:愉悦,让自己休息。交朋友。聊天。找些相干的事,探索自己的兴趣,向内探索,更好认识自己性格优点缺点,调整负面情况,找到是和的生活模式,把OI 搞好考一个好大学同样甚至更重要。考上一个好大学的价值并没有以前那么高,不要给自己压力,不要所有都压在OI 上,把眼光放开放长远。每天开开心心,一天比一天更好。

Pro Tips — get them while they are free 你需要牢记的事情。 How to practice Competitive Programming [Um_nik version] ix35
command_block OI中转站 Alex-Wei qoj
Problems that I authored so far