icpc竞赛退役经验分享

icpc竞赛退役经验分享

前段时间某个竞赛的负责老师找我,说是有个经验分享的机会,于是根据我孱弱的竞赛经历,写了这篇短文。


主要想分享一些关于训练的想法。

大部分的竞赛初学者学习竞赛时,一般有专题学习与思维能力训练两个主要的方面,再下来就是模拟真实的比赛训练。而这三个部分中,目前来看,不管是对于竞赛水平还是自身能力的培养,思维能力一定是最重要的,它决定了水平最终的高度。
沉迷学习各种神奇的科技,或是只喜欢和队伍一起打套题训练,平时完全不单练,我觉得这两种做法都是有问题的。这样练下去很可能会发现,自身水平的提升十分有限,甚至很容易会出现瓶颈期。我觉得思维能力就决定了这个层次高度。
此外,一定不能一直刷同一个专题,对于大部分普通选手来说,很容易陷入思维的一个坑里,也就是“思维僵化”。发散思维对于竞赛选手来说真的非常重要。
对于思维能力,有几个专题其实比较有利于发散,比如:dp、贪心、构造。实际上,将这三个专题做好,已经能算是很厉害的选手了。日常训练就可以在codeforces查找这3个方向的题目自己做。此外,也可以自己多打一些atcoder里的比赛,相比于cf,atcoder的题目更偏思维一些,大量参加各种比赛并补题也是一个非常有效的方法。
关于在做题时具体怎么思考,我只能给出一些参考的意见,毕竟我其实做的也不算好:
(1)读题的时候一定要把题读全了,尽量把样例算一下,这一点没做好比赛时很容易导致白白“坐牢”;
(2)注意数据范围,根据数据范围大概猜一下算法复杂度,比如:
10^9 以上可能是 O(1) 或者 O(logn)
10^7 ~ 10^8 可能是 O(n)、O(logn)、O(1);
10^5 ~ 10^6 可能是 O(nlogn);
10^4 ~ 5 * 10^4 有可能是 O(n sqrt(n));
10^3 ~ 2 * 10^3 可能是 O( n^2 )、O(n^2 logn)等;
100 ~ 500 可能是 O( n^3 );
30 ~ 50 可能是折半暴力或者高次的多项式复杂度;
15 ~ 20 可能是 O( n 2^n );
更小的有可能是爆搜了 O(n!) 之类的。
当然也可以向上兼容了,不过大部分题目会把数据范围开到std的极限,根据复杂度试试反推一下算法;
(3)然后一部分的题可能在读完题就可以想出做法了;
(4)如果没有秒出做法,先不要关注最后的解法,试着找一些题目的性质,有趣的性质往往很重要,如果能发现点什么也许就是关键;
(5)部分猜测的性质,不一定要完全证明,努力尝试举反例,举不出来的话,那估计就是对的;
(6)尝试从几个角度解决都失败之后,可以冷静一下,总体回顾一下之前的几个解法,也许可以发现点啥;
(7)想想跟做过的题目有什么相似之处;
(8)有部分的题目可能就是几个题堆出来的,试试能不能把问题分解成几个子问题解决;
(9)如果是可以打表的题目,10分钟没思路,果断打表,也许有惊喜吧,除了直接找规律,也可以分析下答案的公式的形式,试试BM或者多项式插值;
(10)部分计算几何、模拟之类的题目要评估一下实现难度和调试难度,不要感觉会写了就写,要想想有没有更优美的实现,甚至有些题出题人自己std写了5h,让选手比赛现场写,所以要冷静判断下;
(*)其实根据我的经验,很多的高手往往靠猜和直觉就很无敌了,我的队友们就总是会在比赛时说:“我有一个大胆的想法”、“我猜了一下,写一发试试”,然后没过一会儿就会传来:“诶,我不小心过了”,并伴随一阵轻快的笑声。
水平有限,太多人比我厉害了,所以说的不一定对,大家批判着看吧。

posted @ 2022-02-23 19:21  RRRR_wys  阅读(131)  评论(0编辑  收藏  举报