做题过程
拿到题,读完题,感觉T1送分,T2有点头绪,T3战略放弃目标15分。
先打了T1,检查无误后就去打T2。
T2仔细想了下,觉得可以用堆+线段树搞一下。先打了普通的只记录权值的堆,然后发现要重编号…想着既有小根堆又有大根堆,还要支持删除某位置的操作,有点恶心,就先打了暴力对拍程序。暴力打完了,思路也清晰完整了些,就继续实现自己想法。因为对于插入和删除操作都要分两三种情况分别讨论,程序打得有点长。调过了样例后开始对拍,没想到bug一堆。调到了11点多还有一点小bug,就先去打T3。
T3手算了n = 0~2的k=1的答案,发现是个等差数列。然后就很快打了,打完没检查就去完善T2。
T2对于小数据正确率还是很高的,拍了一会儿才找到一个较小的错误数据。调了一下,过了那个数据,但还是有bug,又要等一会儿才能拍出另一个错误的小数据。这样拖到11:30还没调出来,就有点紧张,因为本来想写出T2正解,没怎么想拿部分分,暴力写得并不好。但还是保险先交了题,然后再赶紧调T2。最后已经把bug范围缩小到很小的范围了,但到时间了,没办法,抱憾看着自己垫底。
结果
100+10+0
T3手推时给项数加了1,打程序时打太急了,忘改了,然后又赶时间,人脑运行了一下,以为没错,连数据都没测就去调T2了。实在不应该犯这些低级错误。
T2只有最后一个bug了,是将原来记录权值的堆改为记录编号的堆时比较大小忘记改用它们的权值比较了…如果当时静下心来,从头到尾检查一遍程序就能发现错误了。
而且,作为一个C++选手,我竟然没想到用set…
总结
策略要改进,能拿的分不能丢。不要犯低级错误。
想好做法再开打,边打边改做法是大忌。
简单问题不要想复杂,多想简单易实现的做法。
保持心态冷静平和,有时可以不用gdb调试,从头到尾检查一遍程序查找错误。