Codeforces Round #731(Div. 3) | 题解(A - G)

周六真的是太快乐了。

写完F差不多到零点了,大概猜G是建出SCC然后乱搞之类的题目吧。

但是明天上班,怕睡过头上班迟到,就先休息了。

A. Shortest Path with Obstacle

三点不共线的时候,就是A和B之间的曼哈顿距离。因为最短路径不止一条,所以不会受F影响。

三点共线的时候就需要绕路,多花费2的代价。

B. Alphabetical Strings

维护两个指针分别指向当前字符串的两个端点。

然后每次枚举看当前字母是在那个端点上,然后移动端点。

如果不是端点,那就无解了。

C. Pair Programming

一开始想歪了想到DP去了,仔细想想还是挺简单的,就能操作就操作完事了。

具体就是:看A能不能操作,能就操作,不然就再看B能不能操作,能就操作,不能就无解。

D. Co-growing Sequence

将所有数都看成29位的二进制数。

易得\(y_1 = 0\)\(z_1 = x_1\)

因为要使字典序最小,不妨从前面开始往后面枚举,然后每次尽量把\(y_i\)搞小。

先令\(y_i = g(x_i)\)\(g(n)\)表示\(n\)按位取反。现在\(x_i \oplus y_i\)是全1,必定符合条件。

然后因为要尽量小,所以从\(y_i\)的高位开始枚举,看当前位的\(1\)能不能变成0,能变就变。(贪心)

然后就没了,\(O(n \log n)\)搞定。

E. Air Conditioners

题目给的式子还挺迷惑的,要记得\(a_j\)其实就是空调的下标。

对于每一个位置\(i\),可以将空调分为两类:前面的和后面的。分别计算两边的最小值,最后再取一遍最小值,就能得到答案。

对于前面的空调,记它在位置\(j\),它对\(i\)的贡献为\(t_j - j + i\)

对于后面的空调,记它在位置\(j\),它对\(i\)\(t_j + j - i\)

因为当前枚举到了\(i\),所以\(i\)可以视为常数,而剩下的部分就是一个前缀最小值和一个后缀最小值,\(O(n)\)预处理一下完事了。

ATTENTION:有空调的地方并不意味着温度就确定了,没仔细看题喜提一个WA on test 2。

F. Array Stabilization (GCD version)

直接二分答案,然后\(O(n\log n)\)检测是否满足条件。

由于元素是环状排列的,这一类问题的经典处理方法:复制一遍原序列粘到后面。现在就从环变成序列了。

注意到,对于\(a_i\)\(k\)轮之后,\(a_i = \gcd(a_i, a_{i + 1, \dots, a_{i + k}})\)

如果能\(O(\log n)\)获得区间GCD,那么就能\(O(n \log n)\)求出所有元素\(k\)轮后的值,然后就能判断是否满足条件了。

区间GCD可以RMQ写因为GCD满足可重复贡献,也可以搞差分然后线段树维护之类的。

后一种做法还可以支持修改操作,不过本题不需要修改操作。

G. How Many Paths?

传送门

posted @ 2021-07-11 10:56  _Backl1ght  阅读(117)  评论(0编辑  收藏  举报