人生最后一次CSP,但是还是做得非常不好。
能做:100+100+100+70=370
估分:100+100+100+0=300
民间测试:100+60+100+0=260
直接裂开。
拿到题目很自然地看了所有的题。T1思想简单直接跳,T2显然是水题,T3一眼不会,T4似乎是个水题(后来发现题目大意看错了)。
接下来思想就在T3和T4之间反复横跳,T4后来过了很久也理解了真正的题意,基本上理解了题意就会(O(nlg n))了。
不过这T3倒是搞了好久,后来想到个朦胧的思路认为可行。
第一个小时的想题时间结束了,于是开始写题。
按顺序直接刚,结果刚T1的时候心态崩了,硬是搞了一个钟才过了所有的样例。
刚T2花了不到10分钟,肉眼查了下没有发现问题,感觉比T1容易切,直接过。
接下来搞T3,搞出来之后发现WA了。后来进过长时间的手推、玩样例,搞清了所有的细节,过了第一个样例。但第二个样例过不了,调试时发现拓扑排序的时候并没有遍历所有点。发现不到一个小时了干T4去,后来回来查的时候想起新开的点(即把询问当成函数)不一定是唯一的零度点,改了之后大样例过了。因为是计数题所以也放心了。
搞T4,不到15分钟干出(O(nlg n)),感觉这次比赛370稳了。最后半小时,想到了两个队列的做法(比赛后证实是错误的),十分钟内搞了出来并过了大数据。感觉能AK。
最后的时间是检查,先检查T1,测了下消失的那几天,发现有点加一减一的问题,修正了;T2T3感觉没错。
反复检查,最后一分钟意识到T4两个队列的做法有个细节没有加,由于只需要写一个短短的表达式所以我开始写了。然后工作人员喊结束的时候,我发现我加的细节加错了(大于号和小于号打反)。这个细节,如果不加还可以水点分;加了而且对了自然可以水更多分,但加了而且错了就爆0了。
我刚出考场就吼出来了啊,啊啊啊再给我一分钟不就AK了吗!
后来回家的路上在UOJ群上讨论,忽然有人提醒:1ull<<k
当(k=64)时结果是(1)。还有(n=0,m=0,k=64)时输出(2^{64})(要手写不然输不了这么大的数)。
吐槽下CSP怎么这么喜欢搞这种反向区分的东西,上一年也搞过。
在车上听歌闭目思考,忽然发现T4的双队列做法还要加个操作,于是又去UOJ群讨论了一番。最终发现:就算加了这个操作还是有锅,因为没有办法处理值相同编号不同的情况。
反正T4爆0了,意识到本来就切不了心中平衡了一下。不过本来也应该要有70分的……
最后在牛客和洛谷上测了,以牛客为准,分数就是上面所述那样。T3果然切了,T1松了口气,才知道T2一挂就挂40分(前三题都没有看部分分的),和确认了一下T4确实一分没有。
总结一下:
- 对于正确性不会严谨证明的做法,如果此时也有暴力做法,务必将这两个做法打包到一起。
- 看到位运算有左移(64)位的一定要小心。
- 最后一分钟什么都不要改(因为此时连测样例的时间都没有,改了可能手误)。关闭IDE静静坐着就好。
下次我能做到吗?
再结合一下最近的训练状况说说吧:
- 打模拟赛的时候多在想正解,部分分最大作用就是提示我想正解,如果想不出才会迫不得已写部分分(除非是个需要拍的题)。其实通过这次比赛,我又发觉,分数也不一定要追求极致,明明会370,那就先保住这370,再往高处走嘛。所以,如果正解实在比较难想或难写,弃掉它写部分分然后将多余的时间检查也不错。
- 模拟赛的时候做题的节奏可能会比较乱(当然这和模拟赛的题目和真正的CSP-S2的差异有关系),正式比赛的时候我都会规定自己想题一个小时,然后写完所有能写的;但是在模拟赛的时候,这个想题的一个小时可能会延长到一个半小时甚至两个小时。这个问题怎么解决,或者说这个到底是不是个问题,感觉也没有什么比较明确的说法,就考验自己随机应变的能力吧……
- 然后就是经常挂分的现象……确实,比起正式赛,模拟赛中查程序错误的力度不够;反过来这也可能会影响正式赛。这个问题,也应该在后面的模拟赛训练中进行一些调整。