本博客用来记录遇到各种比赛遇到的各种问题,以此来警醒自己不要再次犯错,绝赞持续更新中;(另外,为什么我很严肃的写的这篇博客,内容读起来会这么搞笑啊,果真都弱智错误)
心态
看到一个似乎很难的题没什么思路,千万不要有“完了,这估计又是要用什么我不会的知识来做”的想法。因为这样的想法不会帮助你做出难题,但确实会让你做不出来或很晚才做出本应做出来的简单题。
把暴力简化是都能想到的思路,但有时候简化了却做不了/不好做的不如往暴力了想一想,例如2020ccpc绵阳G在注意到%3等价的性质后,其实就可以直接暴搜了,如果继续选择人脑讨论的话其实反而容易错。
debug
肉眼debug有时是个好的选择;
dbeug千万不能急!尤其当你手造出一个错误用例,十分激动就去改,然后改完了发现原来能过的样例过不了了(这还是好的),更糟的是,你改过了这个样例,原来的样例也依然ok,但可能其实刚找到的这个错误样例背后对应着一大类复杂、有一般性的用例,而你只相当于把它特判掉了,这就很糟糕,甚至增大了debug的难度。总之,想很清楚了再去改,不要对着错误用例改程序,对着程序改程序!
常见写炸原因
初始化问题,包括但不限于:
滥用memset导致T次memset带来的TLE。
写下(memset(a,0,sizeof(node)))的离谱语句,之中(a)是一个(node)结构体的数组;
初始化语句位置奇怪,比如把刚刚预处理得到的数据初始化没了;
初始化范围不对,尤其要注意按(n)和(m)初始化的话,对应值域是否真的在(n,m)之内。例如2020CCPC绵阳J题数据范围是(n,m leq 10^5)和(x_i,t_i leq 10^5),当做(t_i leq m)进行初始化就疯狂WA而且很难查出(也是CF惯的,一般CF这种题范围就会是(t_i leq m));
排序问题,包括但不限于:
因为样例里都是排好序的,就忘记写sort了;
有两个数组需要排序,只排序了一个(2020ccpc绵阳热身A);
排序语句位置奇怪,比如先排序再求前缀和写成了先求前缀和再排序(2020ccpc绵阳热身B......);
排序数组的长度别弄错了,比如(sort(a+1,a+1+n))写顺手了,但有时其实是(sort(a+1,a+1+m))或者(sort(a+1,a+1+(n-1))),这个出错了同样很难查;
数学相关问题,包括但不限于:
忘记取模!忘记取模!忘记取模!
小心使用组合数时上比下大、出现负值的情况。
其他问题,包括但不限于:
注意边界情况,尤其是区域赛不会像CF那样自动帮你在数据范围里忽略一些边界情况,例如(n)取0、1、2时和各变量取0时;
注意输入是否写反了,比如输入(n,m),被写成了读入(m,n),而碰巧还因为样例就是(n==m)的而过样例了,注意所有样例中相等的变量都要小心检查,程序主体里也要注意;
枚举一些量的时候注意范围,尤其是边界,比如枚举应该枚举([0,n])时错误枚举了([1,n]),如CF1475D在枚举拿多少个普通app的时候范围就应该是([0,n]);