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满足可重复贡献,也可以搞差分然后线段树维护之类的。
后一种做法还可以支持修改操作,不过本题不需要修改操作。