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