今年最可惜的一场ACM

本来这篇想发到自己的写的博客网页上,写完网页才知道我没有服务器,阿里云海外服务器都卖没了,只能回来发到牛客上了,虽然本来就没人看...。

alt 开局看出B是签到题但是漏读了b数组严格单调递增的条件导致样例都过不去,看了眼榜发现此时J已经过了几十个队就去读了下题发现是个简单模拟题就成功签了个到。
然后继续去想B题,由于A数组的数据范围特别小,所以暴力枚举所有和的可能只有不到200种,每次贪心的去取总时间复杂度大概2e7左右,已知需要的和的大小(sum)时贪心方法为从左到右枚举每一个数(a[i]),判断在其之前最后出现的(我使用的map,这里数据范围只有1-200用数组标记也是可以的)与它相加和为所需大小的数(sum - a[i])的位置,并维护一个已经取过的右边界,如果这个数位于右边界以右,则对答案的贡献加一并更新右边界为i,否则忽略此次匹配,无论是否匹配成功,都要更新此数值(a[i])最后出现的位置为i。
过了B之后队友讲了下E题的题意,发现就是找第一个a[i]不等于2^(i - 1) 的位置,即可求出唯一的模数mod,然后用快速幂板子判断后面的数是否都满足a[i] = 2^(i - 1) % mod,满足即输出mod,否则输出-1,特殊的是如果所有a[i] 都等于 2 ^(i - 1) 此时所有大于2^(n - 1)的数都是合法的mod,此时有无穷多解也是输出-1,写的过程担心2^(i - 1) 会超出数据范围,考虑到a[i]在1e9以内,就必定会在1e9之前出现不等的情况,此时枚举就会停止,不会继续幂运算下去了。这题被快速幂板子卡了一次罚时,因为我的快速幂板子返回值res默认为1,即任何数的零次幂都会返回1,但此题的模数可能为1,即返回值应为res % mod,hack样例:5 0 0 0 0 0 -> 1 然后就去根榜看I题了,听队友口胡一遍题意之后感觉之前在牛客上做过一个类似的题,就键盘钢琴家敲了份代码(此时我是认为可以在一次删数操作中同时删数组中同一个元素的),过了样例之后队友试了几个数据都差不多就交了上去喜提罚时,然后队友试了一组数据告诉我不能在一次删除操作中多次选择数组中的一个元素(即使样例3已经明确显示这是可以的),我就继续苦思冥想了一个多小时,队友此时一个在看榜上的过题比较多的D,另一个在看无人去开的F题,我实在想不出I题了但是看着I题过的人数这么多应该不是很难,于是就重读了一遍(第一遍)题意,看到样例3我tm!,此时发现我最开始交的代码只有一个地方是需要优化的(之前的贪心是错的),然后就改了个每次二分平均值外层while(1)不知道会不会TLE,但是样例和一些数据都过了,当时也不想改代码了交了一发就AC了,后悔之前没有仔细读题,甚至说之前没有读过题和样例3。
最后一题去看了队友一直做的D题,此时只剩下一小时不到,队友把D想成了一到找规律数学题,我听了一遍题意然后看了下数据范围最多18位数左右发现就是dfs暴搜(后来写代码的过程中队友提醒了下用二进制枚举更好写)其中一个数所有的删除可能然后去检验另一个数是否存在合法解并且删的数是否一致(这里注意题中的提示007,匹配数字的时候需要从后向前匹配,多余的部分前导0可以不算入删的数中),然后写了份代码发现一直WA,以为是做法哪里出现了问题,一直调代码调到比赛结束,结束后发现数据范围取得是long long的极限值,我判断分数相等的时候用的十字相乘爆了long long的数据范围,应该用gcd把原数化成最简分数然后先除后乘判断分数是否相等,不过这都是比赛后才发现的了,这题做出来就可以混个铜牌了。
总结:仔细读题,仔细看数据范围,比上次沈阳站没拿到牌难受得多,上次是bfs写炸了调了俩小时但幸好最后10分钟恍然大悟把B签到题一次AC了(虽然过不过B都是打铁),这次是本可以写出D的,多种原因吧,最后一题时间太少队友把写代码的机会让给我所以很紧张思路也很混乱没有顾得上去考虑数据范围和码的也比较慢,之前I题读错题浪费了太多太多时间,遗憾结束今年的所有XCPC比赛,今年共获一铜两铁。