一、省赛前准备 周五晚把之前暑假刷过的40多道博弈题全部翻了一遍,把基础博弈,sg组合,树图博弈,数论博弈全部认认真真地理清了思路一遍(因为我算好了,年年有博弈,最终事实证明,是对的),再另外整理出了一份以博弈为主的模版(自认为是我本次省赛的杀手锏)。搞完这一份的时候,已经凌晨快4点,本来准备要通宵,结果想到明天下午还有试机,就睡了。 二、宣讲会 一路与集训队的师弟们还有队友来到了华农学生活动中心听郭松山教授略带喜感的讲话,郭老普通话发音确实给力,什么“大学”->“带学”,"final"->“finoul”的,闷闷的宣讲会之后,终于激动了,因为可以试机了。 三、试机 一路因为有个MM带了一只连下坡都不会的带喜感的小狗狗惹的同行人好奇的观望大笑,心情也跟着舒畅不少。终于找到房间536,屁颠屁颠地上楼后,找到位置,跟队友nanke(雄平)两个人就卡好了位置,准备随时开敲(题外话,两年省赛,我的位置都是差不多的,后三排,依稀记得去年悲剧了的地方也是这里,但是这一次,我没有一点儿悲剧感,反而很冷静)。 A题:志愿者说开始时,我有条不紊地打开试题,接着把密码纸粘贴到屏幕下。总共3道题,还是老规矩,我看头,nanke看中间,jopix(陈侠)没来,尾巴就先留着。很快看完A题,是求n<=20个数的序列的前N<10^19个排列数(排列按字典序)。nanke带了康托哈希的模版,很好,推算了下数的最大范围,发现64位整型就可以放下,时间复杂度又行,我就果断开敲了。然后贡献了3个CE,1个RE才ac了。好烦人,编译器的选择是个问题,因为vc6.0的语法规则太奇葩了,基于gcc的Dev又有bug,写代码换行不方便,所以,折中之后决定采用,先在vc6.0下写代码,然后提交前再到Dev下编译一次(最终比赛结果证明,这个方法帮了我们队很大的忙,我们队正式比赛时最终ac了5道题,其中只有一道是2Y)。 B题:A题ac了之后,问问nanke还有哪些题,他说B题有凸多边形,是几何要跳过,直接看C,但是C又看不懂(确实C题在当时只有2个钟的情况下,很晦涩),这时候B最有可能,就让他解释了下,是说给一个n凸多边形,中间有k个点,要求两两之间连线,并要求线段的交点只能相交于(n+k)个点,发现,这道题目没有说到点坐标,直觉告诉我,是水题。这时候nanke说想到公式,非常简单,要试试,就让我打进去了,提交,wa,我们都笑了。再用笔画画,发现,其实突破口很简单,题目没有说到最多分割为多少个三角形,那么就是固定的,固定的就可以通过加点来考虑,我先加一个点,就把一个n边形分割为n个三角形,然后每个三角形加一点,就增加了2个三角形,然后,公式就出来了。nanke写了几组数据,都没错,那么我就提交了,结果很快wa了。我继续改进公式,大概10分钟后,我真觉得没问题了,要么题意理解错,要么数据错了。又看了10遍题意确认题意没错之后,我真有点相信是数据出错了,这时候我的脑海中有一个场景,pc^2把数据输入进来,然后我的程序小数据过了,但大数据都错了,但是又感觉题目给的数据范围一定不会溢出,就半信半疑地把int改long long,然后提交了。结果是令人震惊的,居然是Yes(感慨一定会有很多人在这题上悲剧了吧)。 A,B过后,已经一个半钟过去了,看了下rank,广东省145只队伍,有7只AK,我们排名20+来着,在我们前面,有本部的jnu_team3(后来得知里面有各种牛师兄,膜拜先),他们也是2道,但是准确率比较高(但是我们不怕,因为我们今天的CE是为明天的有条不紊做准备的)。
12号周六晚上,比赛队伍碰头,其中有可爱教练--平哥,也有华工研究生家赵师兄,很好,这种场面意味着:绝对可以饱一顿(哈哈,结果是又是晚餐,又是宵夜,大家都happy,happy的);饱了两顿后,回到酒店,马上打开笔记本(复习不完,特意带来的),翻开我的各种心血模版(其中有一些是用类封装过得,用起来爽爽的,比如网络流,线段树,Treap树,归并树,划分树之类的这些大型算法)。然后就想了博弈,动态规划变种,还有单调队列、图论建图之类的灵活题。 洗完澡后开始看以前的博客(博客后来写着就不写了,因为感觉太浪费时间,直接放硬盘,写解题报告就够了),看了以前刷过的二分匹配,看到了建图,然后就yy了,感慨二分匹配建图还是有很多灵活之处的,虽然不及网络流建图,但也很巧妙,看完二分匹配已经是凌晨1点了,该睡了。 睡前跟陈侠扯了扯一些社会的扯淡事,扯着扯着,就想起了去年的家赵师兄(感慨:时光过得好快)。 迷迷糊糊即睡着了,其实我还是蛮想聊下去的,但是想想明天9点半就开始比赛,就果断睡了。 五、正式比赛(9:30-14:30) 进入正题之前,先说说今年大概地题型: A题:基础题,3分钟可以搞定的题 B题:数据结构题,40~60分钟可以搞定的题,我用treap树 C题:动态规划题,比赛中想不出 D题:据说是编译原理题,比赛中没时间看题 E题:动态规划题,要用到分段DP,比赛中想不出来 F题:弱化版数学期望题,简单枚举+二分,15分钟可以搞定的题 G题:找规律博弈题(压轴题),比赛中打出sg值表,找了快2个小时规律,硬是没找出 H题:数学期望题,比赛中没有时间想 I题:图论+位运算,比赛中没有想到,比赛后知道用bitset,惊呼,原来很水,40~60分钟可以搞定的题 J题:记忆化搜索,可以看成是数位DP中只含49的弱化版,40~60分钟可以搞定的题 K题:基础题,3分钟可以搞定的题
早上9点准时到华农(今年的主办方)软件学院楼下。这次没有看到中大20+只队伍壮观地坐着中巴车过来。 9点30分之前进场,我们队3人卡好位置准备等待。 一小会儿后,志愿者宣布开始比赛(可以听到大家唰唰的抽题声音),每人一份试题之后,还是按试机时有条不紊地做好准备工作。总共11道题,还是按老规矩,我负责ABCD,雄平EFGH,陈侠IJK。拿到A题后,咋一惊,题意这么长(心想传统不是应该是水题么),耐着性子,冷静地看完后,发现,果然很水,属于3分钟就可以搞定的题。这时候nanke看了jopix的K题(也是简单题),K题题意更短,他已经在敲了。 看着A题没问题,我就再顺着题目往下看找水题了,这时候jopix推荐了E题给我,大概说了下题意:就是给定N块钱,然后有1,5,100,5000的面值,要把N块钱换为这些面值的钱,求换的方法数。听完题意后,我想,这种题以前做了不知道多少遍了,我知道典型的做法是"母函数"与“DP”,但是看看N为10^18次,就知道只能是DP了,这种题花时间多,还不知道能不能做出来,就跟jopix说先放着,他说他要用一般方法想,我跟他说要优化,优化得过了就过了,后来他好像也放掉了(E题直到比赛结束基本没人做出)。这个时候nanke搞定K题了,我就马上上机,一下子就搞掉A题了,很不错,这个时候我们都是1Y(我们最怕的就是卡水题上了); 下机后jopix又推荐了F题给我,他说是期望题,然后我就听他讲,这个时候nanke敲的I题出麻烦了,他叫我过去帮忙看看,I题题意很短,就是给定一个10000个点的DIG,求每个点能到达其它点的个数。看完题意,我瞬间觉得很水,不过看看rank,咋才一队过了这题?然后他跟我说用记忆化搜索,我调了下程序后发现了,其实该题不是记忆化搜索,因为有个麻烦的地方解决不了。“就是一个点的后继能到达的点可能有重复,这个是致命的,宣布算法错误,换题”,1是因为大家都没处理过这种大集合式的,2是过的队伍实在是太少了。 宣布I题算法错误后,我们的机位一下子空了,这时候大家都在适合的题,刷了刷rank,除了刚过得2个水题,就F跟J题过的人比较多了,这时候jopix看中了F题,nanke看中J题(他跟我说用类似数位DP的解法,我觉得行,可以用类似HDU只含49那题的解法);这个时间就jopix跟nanke一起换机搞题,中途我又刷了下rank,看到B题过的人也渐渐上来了(这个时候应该是11点左右),好吧,没题做,那我就看长长的B题吧,印象中看B看了好久,看的过程中jopix 1Y过了F题,哈哈,这个时候过这题的队伍还不多的。 搞懂后,发现题意是这样的:就是规定一种矩阵,这种矩阵每行(0~row),每列(0~col)都要求从小到大排序,然后有3种操作,I插入一个数,然后矩阵还是要满足性质,如果矩阵满了就删除最大的那个数,R,删除一个指定的数,F,查询是否这个数存在。心想这不是挺简单的吗,用优先队列维护最大值,然后用mulitset哈希值存在不存在不就行了?好吧,这个时候nanke交了一次J题,wa了,那我就上机敲B题了,敲了一半发现,只用优先队列与mulitset是不行的,因为删除一个值的时候,优先队列怎么随机删?(蛋疼,算法错误,不过总感觉处理这种问题的算法有很多,所以一点儿也不着急)。这个时候机子又空了,nanke在调试,jopix在看题,我在想算法(这时我想,维护最大可以用heap,保证随机删除,可以用tree,那么两者结合起来,不就是treap吗,好极了,用treap,只要不卡时间,就可以过)。然后就拿模版开敲treap,敲的过程中,nanke找到bug了,他改了下代码,哈哈,2Y啦,这个时候应该是12点,我们的气球上升为4个啦,(很不错,只要过了B题,就有5个啦)。 好不容易搞完treap后,测试了下发现没错了,就继续把主代码搞定。洋洋洒洒有一两百行,测试下数据,检查下逻辑也没问题,用dev测试了下就交了。结果是令人开心的,1Y。这个时候马上刷rank,发现排在24名(心想,再来一道吧,那么第一名就应该可以稳了)。这个时候应该是12点出不多,我们开始喝华农酸奶了。 这个时候我下意识地去看博弈题了(这时这道题目只有一队过了),不过总感觉自己是有备而来的,不能随随便便就放弃,好歹也看完题目再做定论。让jopix说了下题意后发现,真是经典的sg博弈啊。求sg值也可以用O(n)的方法,唯一的缺憾就是n达到10^18。看到n这么大,我下意识就是sg值要找规律(1、是我做过类似的,2、是求sg值的方法就一个,而那个方法必须要O(n),那么剩余的肯定就是规律了)。然后我们的悲剧之旅就开始了,我把前1000的sg值用代码打了出来,然后惊奇地发现,sg值居然优雅地稳定在了[0,2]这个区间,这也太少见了吧。肯定有规律,有规律,有规律。这个时候我喊了队友们,跟他们说这个惊奇地发现,然后我们3个傻瓜就对着那几张打出来的sg值的纸看啊看啊,看了整整快2个小时,最后坚持看到了比赛结束也没找出。 比完赛后,我下决心一定要问到这道题目的做法,然后就去一个房间一个房间地找过了该题的队伍,(好难找,毕竟只有2个队伍做出了),最后好不容易地找到了华工的队伍,问了其中一位大牛,他说这题是队友做出来的,队友用了sg值找规律,然后剪枝,就出来了(好吧,诚服了,技不如人,好像该队就是传说中的yameidie队,两届省赛都排名第2,每次网络赛都能看到他们的身影,小弟佩服不已啊)。 倒在了自己这次有备而来的博弈题上,“好极了”,年年有博弈,年年做不出。 唯一可以安慰自己的就是,颁奖典礼上,出题人说这道博弈是用来本次比赛压轴的。 六、颁奖典礼 记得以前平哥好像说过,没前8就不用去参加颁奖了,这次好像有6、7、8的样子,就去看了,结果看了最后封榜后的各种激烈战况,甚是激动啊,感慨一等奖的牛队就是牛队,我等还是很有差距的,但是最终排了28名,拿了个2等,暨大也排到了第7(有奖,据说还创造了点儿小历史),也算不辜负此行,与之前一整年刻苦地训练了。 七、总结 总的来说,经过之前那么多次的模拟赛,做过的总结(总结很重要)都用上了,整个比赛的流程都基本是正确的,1Y率也把握得不错。只是当做完5道题之后,花在博弈上研究规律的时间太多了(怪我自己太自信了),还有就是知识面还不够广,否则I题那道DAG就可以搞掉了(场上就有队伍20分钟就搞定了)。最后,动态规划(今年又出了3道)还有数学期望始终是硬伤,相信以后集训队的师弟们可以冲出去的。 还有留给自己的就是,这一次又复习不完,自己没有很好地弄计划安排时间复习,还好最后没有因为这个而留下遗憾,着实捏了一把汗啊,以后切记切记。 |