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

周六真的是太快乐了。

写完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(nlog 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?

传送门

原文地址:https://www.cnblogs.com/zengzk/p/14995424.html