CCPC2016合肥小记

今天参加了CCPC2016合肥站的比赛。因为z+y的神脑洞,我们没有在规律题上怎么卡,而是死在了图论上,果然Cu到Ag还是算法不行。今天重现赛,我把我改掉那&&短路的代码交了一遍就1A了,考虑到我比赛最后30min一个人在队友怀疑中敲完了自己的思路,而且被短路虽然是低级失误,但我之前真的没遇到过(我平常if, for都是打大括号的,这次实在是赶时间)。我也问心无愧。我不遗憾,只是太可惜了。代码

正式赛赛题

我们过了HIEC,卡了A(图论)。
I题是位运算,对r先求补,mask掉highbit,然后不停lowbit修改l,比赛的时候zyyyyy写的,这是重现时我写的代码,在实际上写的时候将long long映射到int[64]会比直接的位操作要方便一点。
H题要求给定序列a[i],查询a[l..r]的xor的结果。一开始我样例搞错了,因为我把异或和非异或记反了。
E题扫雷,要求是3行N列的矩阵的扫雷游戏,其中第二行的所有格子是已知的且都没有雷。求所有雷的安放的情况的总数。可以发现只要第一列确定了,后面每列的雷数(0, 1, 2)就确定了。这里贴一份网上扒的代码
C题是一道博弈的题目,给定一棵树,树的边权为0或1。对于每个查询,给定一个点作为树根,女生和男生交替选择一条权为1的边,并翻转从这条边到树根路径上的所有边。直到某一方不能找到权为1的边时,另一方就赢了。首先对于一条链来说如果根节点所在的边权为1,那么就可以翻转。一开始我没看懂,因为树的顶点是可以指定的,所以不一定就在最上面。
A题,将一个竞赛图拆成两部分P和Q,判断P和Q是否同时都是传递的。当时我们的想法是首先不能有环,其次每条链上都必须是传递的,也就是每两点距离都是1。因此我当时敲的解法是dfs,使用to[u][v]表示能从u到v,假设现在对s进行dfs,首先对所有s连通的点i进行dfs,如果不满足性质则整个都不满足性质,然后检查i的所有能到达的点j,如果从s到j有直接边并且从j到s没有后向边,那么就是满足性质的。不过时间比较紧,我调试的时候遇到了sof(递归爆栈),当时比赛没发现是sof,因为控制台上没有出现任何错误提示,都以为时中途某个代码RE了。后来发现是有一句话把dfs短路掉了,导致最后一个单独的点无法被访问。对这条题目是比较遗憾的,因为当时队内一直希望找到更有效的解法,我自己也不自信,等到最后的半小时的时候我才开始敲我的思路,最后也非常紧张,没调试出来。我们对面的河南大学软件学院的同学是用了SPFA(O(kE), k<=2)求了每两个点之间的最短路(dijkstra的O(V2)说会超时),然后检查是否存在有两点之间距离大于等于2。另有做法是分别添加Q的边和反向边插到P里面,然后拓扑排序判断是否有环。
特别注意的是,我们使用PC^2评测的时候,PE是判成WA的,也就是没有PE,在做H还是I题的时候多输入了一个换行符,于是就WA了,浪费了一点罚时(不过也到不了银牌就是了)。
PS补充一下CB有的时候是不能直接在Console黏贴的,这是正常的,可以将控制台换成gnome就好。

感受

  1. 合肥站的组织继承了ccpc组织优良的传统(虽然这才第二年)。热身赛的时候我们的键盘是大回车,导致backspace很容易按错,结果主办方第二天就换了键盘(虽然这次end键移到右上角,各种误触page up了)。
  2. 安徽大学好大啊,而且建筑特别漂亮,环境也好,第一天中午在操场上玩了半天器材,晚上走了半天才从最北边走到图书馆(中轴)。
  3. 第一次混进了教练餐(自助餐),感觉挺不错的,宾馆是安徽大学磬苑宾馆,感觉挺好的。安徽大学是发的自己学校的校园卡,80块钱,我们都买了一堆零食,SBzyyyyy给自己买个副耳机也是醉了。
  4. 正式赛早上恰逢合肥国际铁人三项,好多人堵在天宫酒店过不来,我们在坐在体育馆的看台上等了好长时间,中间还有志愿者给我们送来热水,期间我们看隔壁icpc大连场大佬们各种神过题(后来那一场4个AK,7题才铜)。最后十一点半比赛才开始,很多人最后都没赶上回去的车。
  5. 有幸遇到了初中同桌+6,本来晚上准备找她吃饭的,结果她晚上有个招聘,不过招聘完了晚上大家在宾馆玩杀人游戏,不过真是醉了,每次都是天亮了我死了,唯一一次我没死是因为我是杀手。
  6. 热身赛的时候没有比过石河子大学,正式赛报了“仇”。
  7. 学弟们都很强,希望他们能够再接再厉,为我校取得更好的成绩。
  8. 同沈阳最后一条感受。