Codeforces Round 621 (Div. 1 + Div. 2)
USACO入侵CF
A. Cow and Haybales
题意:
一行 \(n\) 个数,每次可以将 1 从一个数移动到相邻的数,求 \(d\) 次内 \(a_1\) 最大值。
思路:
显然先移动 \(a_2\),然后依次类推。
B. Cow and Friend
题意:
在二维平面上,一次只能走恰好 \(a_1 \sim a_n\) 中的一个数,求从原点走到 \((x,0)\) 的最少步数。
思路:
首先不难发现,如果非常远,我们肯定是先走最长的知道比较近。
所以我们先不断走最长的知道距离小于等于其两倍,这时候我们肯定可以再走两步到达,但是我们要判断现在有没有一步到的方案,如果有就一步到。
C. Cow and Message
题意:
一个字符串的一个子序列如果下标是等差数列就是好的。求一个子序列使得其作为好的子序列出现次数最多,求最多出现次数。
\(|s| \le 10^5\)。
思路:
不难发现,如果子序列长度大于等于 \(3\) 一定不会更好,因为前两个就够了,所以我们只用判断所有长度为 \(1\) 或 \(2\) 的即可,精细实现可以做到 \(O(26n)\)。
D. Cow and Fields
题意:
给定一张无向连通图和若干个特殊点,要求在特殊点之间加一条边,使得加边之后最短路最长。
\(n \le 2 \times 10^5\)。
思路:
不妨设 \(a_i\) 表示 \(1 \to i\) 的最短路,\(b_i\) 表示 \(i \to n\) 的最短路,我们就是要在特殊点中选两个点使得 \(\min\{a_i + b_j, b_i + a_j\}\) 尽可能大。
但是有个最小值不好处理,我们考虑令 \(x_i = a_i - b_i\),这样最小值变成 \(b_i + b_j + \min\{x_i,x_j\}\),按照 \(x\) 排序就好了。
E. Cow and Treats
题意:
有一行 \(n\) 块草场,\(s_i\) 表示其类型。
有 \(m\) 头奶牛,\(f_i\) 表示其最喜欢的草场类型,\(h_i\) 表示其饥饿程度。
一种划分只两个不交集合 \(A,B\),\(A,B\) 中的奶牛交替吃草,每次 \(A\) 中从左边出发,\(B\) 中从右边出发,一头牛只吃自己喜欢的类型,会一直吃到 \(h_i\) 然后在当前各自睡觉。如果一头牛吃不够或者碰到了睡觉的牛,那么他会很伤心。
一个划分是好的当且仅当没有奶牛很伤心。
求所有的好的划分使得 \(|A|+|B|\) 最大以及方案数。
\(n,m \le 5000\)
思路:
我们首先发现其实只要 \(f\) 不同其实并不影响。所以我们考虑同一个 \(f\)。
显然最多选两个,一个放左边,一个放右边。
那么现在只要分出两个集合,并且前面的和后面的不相交即可。内部的排序方案是唯一且存在的。
我们考虑枚举分界点,为了不重不漏,我们要求前 \(k\) 个属于 \(A\) 且第 \(k\) 个有奶牛睡觉。
我们对于每一种类型单独讨论,不妨设 \(a_i\) 表示奶牛在左边是睡觉的位置,\(b_i\) 表示奶牛在右边时睡觉的位置。
如果选一个,则需要前 \(k\) 个中有 \(a_i\) 或者后面有 \(b_i\),如果有 2 个,则就是前面选乘上后面选。
我们用前缀和维护,但是如果 \(a_i < b_i\),则计算 \(k \in [a_i,b_i)\) 时都会计入,但这是不合法的,我们可以用差分处理然后减去即可。
但是我们有一个要求 \(k\) 必须选,我们发现其实只关系一种颜色,且考虑到 \(h,f\) 不同时相同,所以我们就特判一下,选一个就只有一种方案,选两个就看一下是否有 \(b_i > k\) 即可。
时间复杂度 \(O(n^2)\),但是离散化一下其实可以做到 \(O(n \log n)\)。