正式赛。

      两年时间三次参赛三个铜牌,比赛结束的一刻也就意味着三个多月以ACM为中心的生活要结束了,这次似乎比去年在哈尔滨的时候要平静了许多,也许是自己老了,开始“尽人事听天命”了吧……

      废话不多说,先回忆一下在这五个小时中都发生了什么……

      由于住地距离比赛场馆较远,组委会周到地为我们安排了大巴车来接送(在此表示感谢)。八点十分抵达比赛地点——复旦大学正大体育馆。时间尚早我们和众多ACMer一起上观众席等待。目送工作人员进行增贴座位号等最后的准备工作。八点五十分,发放试题袋。拿在手里掂一掂,分量不轻……看来又免不了一次阅读小考……九点主裁判宣布比赛正式开始。

      比赛开始后,jiangke从前面读,我从后面读,Xnazy敲入vimrc后从中间读。我首先被I的标题吸引了,热身赛就有一道fibonacci数列题,读后发现这次是给出前面最多40位数字,找出符合条件的fibonacci数的最小index,如果前1e5个fibonacci数里没有符合条件的,输出-1。这从后n为变成前n位,这就很不一样了,周期方法不灵了……经过思考可以确定必须把前1e5个fibonacci数的前40位找到这题才有可能做。而到第1e5的级别这个数一定很大很大,绝非水题,先mark了放在一边。H和J扫了一下都不像水题(赛后发现根本就没水题/签到题……)。与jiangke交流,让我看看A题,他开始在纸上进行推到。我读题理解题意:有两种物品,输入各自的体积s1,s2,价值v1,v2,给出一个容量为n的包,每种物品无限量供应,求不超过背包容量的最大能够获取的价值。似乎很简单?但是如果告诉你所有数的范围都是32bit signed integer呢……第一反应是DP背包问题,用二进制方法组合物品,这样两种无限量供应物品最多可以变成64个物品,但是这个容量极大的情况无法DP……环视全场已经有队伍过了A题,现场也只有A题有提交。jiangke经过计算提出既然只有两种物品是否可以贪心一下选取单位价值大的尽可能多装,而且似乎可以证明。我直觉感到可能非最优解但短时间找不到反例,于是决定水一下,同时jiangke和Xnazy交流了I,很快完成代码后过了样例,交,没奇迹,WA……打印代码,换Xnazy上来用JAVA的大数来打I题的fibonacci前40位。果然如预料的,越打到后面越慢,就让程序后台慢慢跑着了。

      开局没能出题,全场依旧只有A题有人过,但是过的队都是牛校……于是我们开始枚举算法,2^31的范围,尝试logn,sqrt(n)的复杂度,网络流?费用流?线性规划?…………都没有什么想法……一个多小时过后出题的队伍数好像还不到20个,而且全是A题。此时意识到本场比赛可能结果会比较惨烈,要特别注意罚时问题。我猜测会不会函数有单调性或者是单峰/单谷函数,jiangke表示无法证明,但是既然没什么其他办法,于是上去水一下。同时Xnazy也完成了打表工作。打表程序跑了40min……我和Xnazy讨论了场上局势,还是只有A题有人过,但是交替范围出现了F、C、G、I,于是我们开始寻找其他可做的题。jiangke写到一半发现了反例,不能二分或者三分来做。

      然后就是每道题都有那么点问题做不了……B题虽然N只是从1-16,但是连超时的算法都没有。C题对那10%的大数据case没有办法,D题太长全场没人交,而且扫雷这种问题弄不好是恶心搜索。E题真是题如其名的boring,二叉排序树10万个节点还要输出其中某一部分构成的图,也许能做但绝对不是5个小时内能做出来的。F题jiangke表示也许可做,但可能会TLE,先mark了,G题是给出两个三角形各自三点坐标,给出一个四边形坐标,问能否通过移动,旋转,翻转来构成这个四边形。同样貌似可做,但是存在四边形退化为三角形的情况,需要考虑的很多,代码量短不了,mark。H题又是坐标又是精度,貌似是几何,还没有队来吃这只螃蟹。I题的表自然没能找到规律。J题干脆不用再看了……

      场上的局面依旧是过题的队不多,依旧以A题为主,但是又出现了牛队过了F、I等。这时A题已经不少了,大部分都是3A/4A,我们不自觉的又开始想了想A题,依旧没想法。果断不能这么想了,再想很可能彻底悲剧的刷新NKU过题数的历史……F题Xnazy尝试对所有10万个前缀进行排序,但是又发现不仅是10万个,还有这些前缀的“前缀”,问题又复杂化了。这时我们又想到是不是可以构建一个trie树来对输入串进行匹配,这个trie树需要有100000个单词,每个节点可能有10个孩子,层数最多40。空间有点悬,因为裁判说过内存限制时128M。而且还存在一个问题是10万*40bit的表能不能交上去的问题,于是就出现了NKU全场第一个也是唯一一个提交J题的情况……其实是因为我们预计铁定不会写J题而用来测试裁判机是否能编译的,很好的是返回是WA而不是CE。我们讨论了一下决定按trie来写。我开打trie模板,并和jiangke一起针对本题进行修改。完成后顺利通过了全部样例数据。检查后比较自信的提交,返回WA……此时已经封榜了……此时压力着实不小……进入艰苦的差错阶段,但是怎么查貌似都没什么错……查看Xnazy的java打表程序也没什么错……我突然想到会不会是静态trie树空间开销了,当时开的是按100000*40个节点,直接增加一倍空间。再三检查后还没查出错,决定不管了交一下,YES!……赛后分析才想到,trie树在走到最低端的时候,要再向下走一次得到NULL值后才会停止,而这最后一次往下走就会超过节点数了,溢出了……而且没有返回RE……最终我们在255min左右2A了此题。

      此时全场有过题的队还没够铜牌数,而且我们比许多6A7A第一题的队伍依靠罚时排名要靠前……过两题的队还不到30个,只要我们再过一题应该可以保证银牌,如果把A过了后再过一个……这无疑是个兴奋剂……评估一下当前状况,还有50分钟左右,A题过的队已经将近60,看似最可能出,但是我们没有确定性算法,但是其诱惑力可想而知,多希望灵光一闪把它过掉……F题G题都可做,但是都不好写。其他题可以不考虑了。短暂分析后决定jiangke开始敲相对更有把握的F题,Xnazy查错,我再继续想A……jiangke敲着敲着也感到真是很麻烦,表示剩下这点时间很难敲完了,还可能需要调试……我这边想到几个可能出最优解的位置以及一些优化。最后30min的时候我们决定再贪心+枚举一下A,于是进入最后的改改改交交交的状态……过程中还加入了一个之前想到但是没加的最小公倍数优化。但是最终的情形是,只要增加枚举次数就超时,减少枚举次数就WA……最终这题以25+次提交结束比赛……估计又是全场最多了吧……

      貌似流水账又溢出了……由于我这惨淡的学分绩,明年可能没时间来参与比赛了……从高二开始搞OI,到大学的ACM,其实收获几个奖真的一点都不重要,三个铜都变不了一个银也无所谓,能用来训练的时间就这么多,大学里各种杂务还要来抢时间,智力也局限于这个水平了……但是最重要的是,在ACM的路上你时刻会发现,很多天生就比你聪明的人,后天比你更加勤奋!你没有停下来休息的资本,没有资格去懒散。不含蓄的说,这比赛相对于……还是需要一定智商的,作为ACMer的优势是通常比较聪明,但是ACMer更大的优势是知道有更多的人比自己聪明……

      知识本是共通的,学习算法的过程中很多东西也就触类旁通了……生活中解决每个问题的方法都可以称之为算法,从这个角度上来讲生活就是由问题和算法组成的,相信ACM的训练可以让人在生活中更加睿智。

      感谢上海赛区组委会及志愿者们的辛勤工作。感谢两位队友的支持,感谢各位亲朋好友有声的无声的支持与鼓励,还要特别感谢因某些原因不宜列出的同学的支持,大家的支持与鼓励在下自当铭记在心。

      南开ACMer的战斗还要继续,祝愿下周即将上阵的兄弟们——天骏君、俊杰君、卓锋君好运!NKU本赛季首银的希望就寄托在你们身上了,更祝愿你们小爆发一下,创造个首金!第一次参赛的兄弟们只要把暑假集训的水平正常发挥出来,以铜保底是肯定没问题的,发挥好点是可以第一次就Ag的,年轻就是希望呀~切记,要坚定的自信的写自己会的,跟风只是选题的参考,切不可一路跟风跟到底……加油之!

 

posted on 2011-10-17 10:37  NKHe!!oWor!d  阅读(408)  评论(2编辑  收藏  举报