preface
进入高中的第一场比赛。noip的分数是与省队选拔相关的,所以这场比赛十分重要。
day1
首先看完所有题目,发现难度和以往完全不一样,而且t3还考了期望(samjia还说noip不考期望题的。。)
半个小时后开始敲t1,很快就过了所有样例,然后肉眼检查了一遍。这道题是两天唯一没有拍的题,然而也是唯一切掉的题,真是有趣!
接着开始想t2。由于t2每个人到另一个节点耗时为1,所以很容易想到拆成x±dep的形式,然后分两种情况。经过十多分钟后,大致想好了带log的算法(虽然是单点修改+单点查询的线段树),然后开始码。码了差不多3000b才发现码错了,然后赶紧码暴力,然后去搞第三题(这时已经过了1.5h)
又读了一遍t3,开始时想到了dp:设f[i][j][0]表示前i节课提交j次申请,第i次没有提交的答案,f[i][j][1]则是第i次提交了。结果最开始没有想好转移,然后又转回t2。
接着发现,我t2的代码只要改一改就可以正确,然后删了1000b,又码了1000多b,然后样例卡了挺久,接着一对拍又错了(还输出了负数),然后又肉眼查了十多分钟,终于对拍过了。
剩下40分钟,去t3码暴力,码到一半发现正解如何转移了,接着把暴力、正解都码完,剩十多分钟开始对拍,又是一拍就错,检查了正解后去看暴力,发现其实是暴力打错了。。。
最后以t3的匆匆码完,结束了day1。虽然估分200+,但是码代码的过程很赶,总觉得会出事。(flag立好)
day2
day1画风突变,感觉day2也不简单。
看完题目,三题都一眼不会。
按照惯例先淦第一题,发现k是不变的,然后开始考虑预处理。由于n,m范围都是2000,所以我直接枚举每一个组合数算答案。由于k很小,最大是21,它的不同的质因数最多只有两个,然后先预处理阶乘的每个质因数出现个数,然后相减即可。很快就码完了,过了所有样例,然后打暴力对拍。虽然对拍过了,但是暴力只能做到n是20的情况(再大会爆long long)。
接着到t2。一个想法:打个堆。码完后发现堆可以拿65分!对于q>0的情况,就把一个数拆成x+i*q的形式,这样就方便许多。接着发现7000000数据要卡4s,1000000都要1s,又卡不了常了,就先放着去淦t3。
抛物线必然经过原点,所以只要枚举两个点就能确定一条抛物线了(注意a<0,b>0)。接着很快码出了一个状压dp。结果第二个样例就错了,发现是精度问题,然后打个eps,我取的是1e-14。之后就过完了大样例。出大数据,发现n=18的时候跑了1s,然后打了个优化,预计能在m>0的时候跑得快点。
剩下一个多小时,我在t2、t3之间辗转,结果两题都没有新的进度。
初步估分100+65+80,感觉还是比较稳的。
后记
接下来是最可怕的。。。
与以往一样,余姚、学军等学校会出些山寨数据,给大家一个参考。选手的程序也是先放出来,到了28号左右才会出正式成绩。
于是,拿到余姚数据和gd的程序后,我们学校就自发地评测了省内几个学校的程序了。
无论是什么比赛,选手们都有一个共同点:考完后,无论嘴上怎么说诸如“挂得很惨”、“成绩不敢看了”,心里都是很期盼看到结果的。一听到有评测结果了,我们在晚修后纷纷跑到机房去。
结果在看到我的考号后的分数后,我心里感觉被锥子刺了一下。然后看每道题的分数,参差不齐。我把我两天的程序拿到手,望着自己的代码和不尽人意的分数,顿时失去了改题的欲望。
时间到了10点40多,该回宿舍了,我在寒风中幽幽地走着,一个字也不想说。躺在床上,那个分数依然在脑海里挥之不去,我翻来覆去睡不着。寒冷的风猛击着窗,我只听到号啕般的声音。
第二天,到了晚修,symbol来教学楼看了大家。symbol没有和我说很多话,但是有一句印象很深刻:“没关系,才高一。你的训练不会因此而改变。”
最终成绩和分数线出来了,我竟然有355分,然后GD一等分数线是280!
代码的错误
day1t2
在余姚数据下只有10分,洛谷上爆0。至今错误仍不明。3000+的代码实在有点难查错
day1t3
首先我的暴力最大只能过到n=20,v=20的部分分,于是出数据的时候,我很自然地在赋初值上直接打了个n=v=20。
然后去看我的正解,在预处理最短路部分把v全部打成了n,然后CCF给的样例不是很大,并且n>v,所以自然没有发现这个错误。如果出现n
day2t1
题目要求的是求“多少对”。
我枚举组合数,然后函数check(int n,int m)返回的值表示
Cmn
是否为k的倍数。ans表示所有质数因子出现次数的最小值,那么应该是这样的:
而我直接return ans;由于暴力可以跑的范围很小,n小的时候查不出这个错。
day2t3
首先设f[st],表示当前被覆盖的小鸟二进制状态为st。
然后枚举一个抛物线(这个可以在之前预处理出n^2个)。这就是朴素的转移。
我的优化是这样的:假如一个抛物线覆盖了k个点,那么我直接预处理会得到k*(k-1)/2次这个抛物线。那么我就在这一个抛物线第一次出现后,给每个点对都打上标记,以后枚举到标记过的点对就直接跳了。结果这个优化竟然是错的。
改成正确的优化姿势:只枚举覆盖了当前状态第一个0的抛物线(最多只有n个),就可以跑过去了。
剩下两题都拿稳了该拿的分数。
余姚数据最终结果:
day1:100+10+44 day2:55+65+0
总结
对拍专题
- 随机与特殊数据相结合:一些n,m的数据范围(例如树的大小、边的个数,等等),要尽量随机,避免总是n,m相等的情况。尽量在范围内n>m,n=m,n < m都出现。同时树或图的形态,或者一些数据,在随机的情况拍完后,要出构造的较特殊的数据。
- 数据范围的问题:有的时候,暴力和正解的数据范围相差很大。这时一定要当心:有的程序数据小的时候很难卡掉,然而数据一大就错,结果只拿个暴力分。所以对拍的程序,能跑的范围要尽量大。同时要想尽办法出相对较大点的数据去拍。肉眼查错也不能少。
- 对拍的程序一定要正确,一旦暴力打错,对拍是会很麻烦的。。你可能会浪费时间在正确的程序上(你的正解也许会很长,并且细节很多)。
others
- 如果思路没有足够清晰,就不应该开始码代码,一旦错了会浪费许多时间。
- 部分分很重要,一旦没有想到正解就一定要去抢,而且可能正解的一些tips正隐含在部分分里(day2t2的三个队列)。
- 心态要调整好。为什么初中总有几个能虐一些高中的?正因为他们没有想过全切,而且心理压力不大,于是在考场上各种部分分+水法,又切掉一些简单题,如果码得稳也能上高分。
- 稳定是最重要的。
永远要放眼下一次比赛,让自己发挥稳定,增强自己的水平,才能在接下来的比赛中缩小与别人在noip上的差距,追赶上来。