西安邀请这个学期的第二个全国邀请赛,成绩不是很理想,但是运气不错还拿到了铜奖。事后总结了一下还是有不少的方面欠缺了很多,于是我们回来以后队内讨论了一下比赛时期的问题,收获颇多。
热身赛:
这次热身赛的题出的很全面,由于因为下午3点才到的西北工业大学,没有办理好酒店方面的事情,所以大概五点左右就去处理酒店了,当然能出的题基本上也已经解决了。总共是三道题,我们三个人分工还是比较明确的,先整体把题过一遍,发现难度的递增顺序,然后两个人开一道题,另外一个人思考第二道题,虽然中间还是有一些不协调,但是基本找到了节奏。
第一题本身是一道简单的计算几何,求一个多边形的面积而且多边形的上面一部分是直线。做题前考虑了一下复杂度和精度问题,然后推了一下计算方法,敲了一发过了样例,然后队友出了几组比较容易出错的例子,也都通过了,但是最后还是WA了,时间大概是二十多分钟。这个时候第二题基本有思路了,就换我写了第二题。另外两个人重新去考虑和检查第一份代码。第二题是一个带权并查集,用0,1去标记当前节点与根节点之间的相同关系,最后再合并和路径压缩上面做了一下处理,测了几组样例一发就通过了。这时候队友把第一题的代码重新修改了一下,修改了几个可能会出现精度误差的地方,然后交了还是WA。这个时候我和另外一个队友在研究第三道概率题,没有什么进展,就一起和敲第一题的队友研究第一问,试了很多种方式还是没有通过,最后时间不够了就走了。
后来结束以后发现是第一问里面虽然说了给出的顶点的横坐标顺序递增给出,但是实际上存在着不递增的数据,我们没有对初始的点处理,所以始终没有通过。
虽然出题方是有一定的责任,但是考虑到还是有很多队伍通过这个题,问题还是总结在我们的身上:
1.虽然题目里面说了递增,但是还是要有好的代码习惯,在读取数据后要进行预处理(不会超时的情况下)。
2.概率题的难度还是不小。之前做的概率的题还是太少了,没有这方面的经验,不知道怎么下手。之前也没有专门练习过这个方面,以后还是要开概率方面的专题,多总结一下经验。
正式赛
正式赛的题难度要比热身赛题目难不少,但是实际上我们还是能开不少题的,至少之前都练习过这方面的内容,但是比赛的时候还是比赛经验不足,犯了一些问题,导致最后发挥得很差。
比赛开始后我们三个人分头去看前中后的四道题,然后大概八分钟的时候找到了签到题,说的是给出多个线段,能不能使得他们成为凑成一个多边形,然后联想了一下三角形的规则,就直接推出了结论,一发过了。时间到了12分钟,我们之前还是有了一百支左右的队伍过了签到题,然后这个时候发现有队伍出了A题,于是我的两个队友去研究A题,我则从后面开始找能做的题,K题是一个比较规整的线段树题,我就着手开始推更新的规则和询问的规则。这个过程中,队友写出了A题,测了一下样例和自己出的几组数据,没有问题就交了,WA了。看了一下榜,已经有几十支队伍出了A题,应该不是什么难题,这个时候我怀疑是他们读错了题,然后就放下了比较难写的线段树题去和一个队友搞A题,另外一个队友就转移去看另外一道过了很多的D题。我们重新研究了一下题,两个人确认了题意以后就开始想方法,第一题是说利用加减和位运算来代替乘法,我们一开始使用了搜索的方法,但是后来考虑到复杂度可能过不了,选择用递归的方法开始做,自己出了很多组样例,基本都通过了,于是交了一发但是WA了。这个时候我们就基本搞不懂A题是什么意思了,然后就看见很多cla,但是我们还是没有看懂cla的意思,因为cla里面说11111-00100=11011,这个我们是通过的,但是后来过了半个小时又说了11011只能是11000+00011,后来说明了应该是标程出错了。我们重新考虑了一下出题人的意思,大概两个半小时以后我们终于把签到题A签了,这个时候已经排到了铜末。然后研究D题的队友中间在我们考虑A题的时候敲了几发D题,都没有通过,D题是一个博弈题,很像之前的Nim博弈,但是我和一个队友一直在找A题的BUG,所以D题的队友一直都在一个人在推。过了A题以后我就开始和那个队友研究D题,另外一个队友研究C题,C题一开始以为是一个暴力题(后来想到看了榜单以后明显就应该不是暴力能做的题,但是出题量第五多的题,第四多是线段树K题,第三多是我们手里博弈D题。到了四个小时的时候,我们还是没有推导出D题的规律,试了几个方法都不能通过,C题也没有进展。最后我们看见G题有很多人过了,我们就开始写G题,G题是一个几何题,给出1e4条线段,然后询问一共有多少个交点,题里面说端点处的交点不考虑,然后我们敲了一个计算几何板子,但是之前敲得不多,调试了很久,最后还是没有通过,一直觉得是精度问题,最后都在修改。比赛结束后听说了这个题卡常数,而且最后好像是cla中说了端点处的交点最后要计算进去,但是因为我们之前一直都在考虑C和D题,没有注意cla里面G题的内容。
其实我们真的没有想到热身赛出了问题以后,正式赛还是会有出了很多的问题,但是考虑到还是有很多人出了,所以总结下来我们有几个问题:
1.对于A题这样的题,还是应该发散一下思维,而且不应该死磕这样的题,考虑多种解决方案。有很多队伍一开始就猜到了题意,我们觉得是和出题人心灵感应了,当然是个笑话,实际上我们觉得还是做题做多了的一种直觉,所以之后还是多练习一下,以后尽量能够不要陷入这样的坑。
2.对于D题后来知道是一个SG博弈题,之前开博弈专题的时候没有做个类型的题目,还是做的题的范围没有铺开来,当然即使没有做过这个类型的题目,也应该推导出来。但是我们的实力确实不够,做题的经验太少,不知道这种博弈题应该有怎么样的推导过程,只能参照以前的博弈题总结出的规律套着改一改,看看之间有没有联系。
3.对于C题发现是一个DP题目,这个也是我们在比赛的时候没有考虑到怎么解决的地方。DP的题目很考察思维,我们始终在解决这种问题方面存在着短板,一直也不知道应该怎么有效的解决,之前一直都是多做DP的题目总结规律,然后多去看看别人的思维过程,做题的时候可以参考一下。当然也没有人指导我们,所以只好继续摸索一下,多做做这种类型的题,也许什么时候能够领悟其中的规律。
4.然后就是比赛中的G题和K题,其实这两道题是很有机会出的,但是一直考虑K题线段树写起来比较复杂,就一直没有去写,如果那时候没有陷入C和D的坑当中,直接去开出题量第四多的K题,应该还是有希望可以拿到银牌的。然后G题最后是卡常的问题一直没有通过,后来比赛结束后和其他学校的队伍讨论了一下方法,发现有一些没有接触过的优化方法过了那个题,当然标程可能是更高效的算法,现在还没有出标程,所以还不清楚。
总得来说:
1.比赛经验太少,以后练习的时候多铺开题目,经历往自己擅长的题目上走,不要盲目跟着过题量走,很容易卡到自己不会的题。
2.做题的类型太少,概率题和博弈题之前做的不多,而且都局限在几个常见的模型上面,没有对他们进一步研究,导致一个模板题,反而成了我们最大的阻碍。
3.DP的思维还要加强锻炼,多总结DP题目的规律。
4.还有就是不能够卡在一个题目上面太久,而不去考虑其他的题目,确实像线段树这种题,代码量虽然大一点,但是思路比较清晰,拿得住就应该先去敲。
5.之后训练赛的时候还要加强读题能力和代码力,减少bug和debug时间,比赛的很多时候都不能一遍通过也是因为没有考虑到一些bug的存在。