最近两场比赛 CF 285 & TC 646

时间:2023-03-09 06:38:54
最近两场比赛 CF 285 & TC 646

Codeforces 285

这场rating又掉了,好在只掉了十多。

题目比较水,但是我比赛时居然只艰辛地过了前两道。

504A

由于图是森林,所以一定有度为1的点,把这些点删了后图还是森林。然后就完了。比赛的时候居然把森林当成了树,交了3次才过。

504B

把排列表示为一个n元组\( (p_0, p_1, \cdots, p_{n - 1})\),其中\(0 \leqslant p_i \leqslant i \),其排名为 \[\sum_{i = 0}^{n - 1}{p_ii!}\]。

把\(p, q\)转化成这种形式,加起来再转换回去就完了。

504C

先算出首位相同的部分,假设为\(L\),那么显然左右端点分别在首尾这两个区域内的区间都应该被计入答案,这部分是\((L + 1)^2\)。

如果两端点都未和首尾相同的区域拼接很显然是不行的。

所以剩下的我们只需要算出左端点和首部的区域拼接(在L + 1)时右端点的可能情况 ,以及右端点和尾部区域拼接(在n - L)时左端点的可能情况。

显然一个可行区间扩大后依然是可行的,所以左右端点可能的情况都在连续的一段内。

然后再求出中间位置的对称半径,以及首尾未被覆盖的最大长度,分情况讨论就行了。

复杂度\(O(n)\)

504D

水题,把十进制转成二进制然后拿bitset做高斯消元,记一下每一行被那些行消过。感觉要T交上去跑得飞快。

504E

先树链剖分,然后每条链单独看作一个字符串。由于有从上至下和从下至上两个方向,所以还要将每个串反向复制一遍。

\(O(n\lg{n})\)把后缀数组建出来,height处理出来,ST预处理好。

然后对每次询问,就可以把这两条路径分别分成\(O(\lg{n})\)段,每两段的LCP都可以在\(O(1)\)时间内得到。用两个指针维护当前比较到这两条路径的哪段就行了。

由于每次比较后,假如还需继续比较,则比较的两段一定满足有一段是另一端的前缀,所以指针一定可以后移。故单次询问的复杂度为\(O(\lg{n})\)。

Topcoder SRM 646

TheConsecutiveIntegersDivOne

题目保证数两两不同,所以稍有常识的人都会发现按照大小排序后取连续k个不亏,并且中间的那个数可以不变。

TheGridDivOne

我感觉这场的600挺可做啊。把所有关键点即有障碍物的点和原点抓出来,把网格分成了\(O(n^2)\)个区域,把每个区域的四个角拿出来跑个最短路就可以了。

然后,在最后10分钟调过了样例(被kawigi坑的,用它跑死活过不了最后一个样例,结果发现是因为每次调用后数组和STL容器没有清空,TC评测时可不是这样的),然后很悲剧地FST。

结果发现是第95个点TLE(总共95个点)……紧接着我意识到了什么。我没有把调试时候加的printf语句删掉,所以输出超时了!这个逗比错误把我整整一道题给废了。

吐槽:TC的arena用着觉得不科学啊,装了kawigiedit还是巨难用,根本就没有调试这个功能。下次我要装个fileedit试试。

1000pt

坑(待我看了题再说)……

UPD(20150117) 刚刚看了题。还不会。只是有点想法:自己打的两场都赢,所以分数变成myScore + 6,然后问题变成最小化大于这个值的个数。由于打了比赛后每个队的分数不会减小,所以已经超了的可以随便搞,让它们尽量赢还没超的。也许可以贪心乱搞?

Challenge

好在今天我开了杀戒(以前从来没有在TC上challenge过别人),成功cha了两份代码,弥补了一点第二题逗比错误造成的损失。都是第一题,枚举区间左端点都写成了i + k < n。