ACM 五一杭电赛码"BestCoder"杯中国大学生程序设计冠军赛小记

对于这项曾经热爱的竞赛,不得不说这是我最后一年参加ACM比赛了,所以要珍惜每一次比赛的机会。

五一去杭电参加了赛码"BestCoder"杯中国大学生程序设计冠军赛,去的队伍包括了今年19支World final的队伍,几乎是全国最强的46所学校各出了一个代表队,十分感谢学校给了我这个大三的老年血手这次去比赛的机会。

比赛在5.2一天内完成,上午的热身赛居然是上一场Bestcoder的原题= =。虽然我们三个人都没做过。。。不过我还是水水的写了前两道题。

在中午的悲惨淋雨后,下午正赛开始了。

A题是一道板刷题,不过相对来说其实想法还是很有意思的,不过并不是很难想。

题目大意是:两个数列 ACM 五一杭电赛码"BestCoder"杯中国大学生程序设计冠军赛小记  ACM 五一杭电赛码"BestCoder"杯中国大学生程序设计冠军赛小记

是否存在3组L,R的区间互不重叠,若R<L可互换这组L和R。

这道题我们大概想了15min,最后是在队友画了一张图之后瞬间明朗的,其实我们只要找到区间右端最靠左的区间和区间左端最靠右的区间然后对于每个区间check是否在这两个区间之中就可以了,于是我大概在30min开始写,并在40min1Y。

J题也是一道板刷题,而且可能比A题更简单想,所以队友又给我讲了J题,然后我继续写不过我的程序出了个低级的小bug,= =。某些测试数据没完全读完就输出了,这让我们WA了一次,还找了大概10多分钟错误,真是打脸。不过最后还是在1h21min时候2Y了。

这个时候榜上有人做的只剩下E题了,不过我们看了一遍之后思路却比较少,E是一个类似于约瑟夫问题的问题,区别在于每次可以走任意步(一个可走步数的集合),问有可能能赢的是哪些人。当时想了很多的方法,包括动态规划,但是每次淘汰一人使得我们想的动态规划都很难搞。这题大概想了将近1个小时,还是没想到标准算法。

之后我我又想了I题,如何在一个可能有重边,双向边,单向边的图里找到一个环(其中单向边或者双向边走过一次后都会被销毁),因为边数(n)点数(m)都是1000000所以还是很容易让人想到这就是个暴力dfs,不过关键在于图如何建。一开始我想的是对于一个之后单向边的图来说,我们能够在O(m)时间内很容易的找到一个环,不过添加了双向边就会产生一些问题,所以我想通过拆点把双向边建成单向边,不过想了好久还是没建对(也许是对于E题耿耿于怀),之后又转回想E。整个过程大概经历了1个半小时左右,期间整个队伍都昏昏欲睡的。

不过在3小时的时候队友突然提出了一个很好的动态规划的方法,令F[i,j]代表剩下i个人时,若BrotherK的位置是1,那么位置为j的人是否可能获胜转移的时候可以枚举当前轮指定的数是什么,那么就可以计算出当前位置j的人在剩下i − 1个人时的位置(假设BrotherK所处的位置是1),然后利用之前计算出的F值判定此人是否可能获胜,时间复杂度为O(n^3)。我终于明白我们为什么前面想不出来了,原因就是我们没有假设固定每次dp位置都是从1开始,这是一个非常好的想法,一下子豁然开朗啊~

在3h23min的时候队友E题1A了。

而且在他拍代码的时候,我感觉我也豁然开朗,发现I题其实只要把双向边并查集缩点,之后不就是一个单向图找环的dfs了吗?

而对于在一个并查集内形成环的情况只有两种,一种是全是双向边形成的环,这个情况下只需要通过并查集时候判断,这两个点是否已经在一个集合里了就可以判断。另外一种是存在一条单向边把并查集里的点连接起来,这也只需要通过一遍遍历所有的单向边来判断就可以了。所以这道题也就轻松愉快的解决了。

不过最后我们还是WA了6次,原因是扩大了栈空间后,居然并查集还是爆栈,我们最后做了个死,强行用评测机来调试到底是哪一段程序爆栈了,发现居然是并查集已经是哭笑不得了,最后居然还写了个非递归并查集。。。然后在4h27min I题7A了。

最后我们只以四题收场,拿了第32名,离我们定的金牌目标还是有一段距离的,个人来看想在区域赛这套题6题保金5题有希望(毕竟好多final队都是5题)。

最后看看题解觉得其实B,C,D都有可能能做得出来,不过就是我们对题的想法还是少了点,而且很难保持五个小时的专注度,这些也是我们之后需要训练的。

最后附上一张比赛照片,顺便玩了下MS的人脸识别检测年龄,ljl学姐的性别居然暴露了,哈哈~

ACM 五一杭电赛码"BestCoder"杯中国大学生程序设计冠军赛小记

5.3 在西湖边逛了一大圈,"那杭州美景盖世无双 西湖岸奇花异草四季清香”  哈哈哈~晚上吃的新白鹿餐厅的杭帮菜也是相当不错。

上一篇:点分治


下一篇:aiohttp