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

AC代码

A. Strange Table

不妨假设表中的数字从\(0\)开始,且行列也从\(0\)开始。

此时数字\(x\)在按列排时位于\((\lfloor \frac{x}{n} \rfloor, x \text{ mod } n)\)

而案行排时,\((i, j)\)上的数字为\(i + j * m\)

最后再转换回来就行了。

B. Partial Replacement

\(dp_i\)为仅考虑\(s_{1 \dots i}\),将\(s_i\)*变为x,且符合条件的最小代价。

那么有:

\[dp_i = \left\{ \begin{matrix} & \infin & \text{if } s_i \ne * \\ & \min_{j} dp_j + 1 & \text{if } s_i = * \\ \end{matrix} \right. \]

为了满足条件1,将\(dp_{first}\)设为1,然后从\(first + 1\)开始计算。

为了满足条件2,取\(dp_{last}\)为答案。

C. Double-ended Strings

数据量很小,直接暴力。

首先遍历\(a\)的所有字串,将其加入集合\(S\)

然后再遍历\(b\)的所有字串,看其是否再集合\(S\)中。

复杂度为\(O(n^3)\)

D. Epic Transformation

\(cnt_i\)\(i\)\(a\)中出现的次数,\(ma\)\(\max_{i} cnt_i\)

如果\(ma\)超过\(n\)的一半,那么\(i\)就不可能会被消完,此时用其余元素与\(i\)一一配对消除。

否则,就代表可以消完。

注意,第二种情况若\(n\)为奇数,最后会剩下一个元素。

E. Restoring the Permutation

用一个集合保存排列。将\(q\)中已有元素删除。

minimum

因为要字典序最小,所以每次遇到重复元素,就拿集合中最小元素放上去。

maximum

因为要字典序最大,所以每次遇到重复元素,就拿集合中当前元素的前驱放上去。

F. Triangular Paths

因为是单向的,所以最终的路径只有一条,其顺序就是将所有点按\(r\)升序排序。路径确定了,现在只需要算出每一步的代价,然后累加就可以了。

\((1, 1)\)走到\((x, y)\)\(x = y\),那么只能一直向右走,代价为\(x - 1\)

\((1, 1)\)走到\((x, y)\)\(x = y + 1\),可以先向左走,再不断向右走,代价为\(0\)

而从\((1,1)\)走到\((x, y)\)\(x = y + 2\)只需要先走到某个\(x = y + 1\)的点再花1的代价向左走。

以此类推,从\((1,1)\)走到\((x, y)\)的代价为\(\lfloor \frac{x - y}{2} \rfloor\)

假设当前位于\((cx, cy)\),下一步要走到\((nx, ny)\)。此时:

  • 如果\(cx - cy = nx - ny\),那么只能不断向右走
  • 否则,此时相当于从\((1,1)\)走到\((x, y) = (nx - cx + 1, ny - cy + 1)\),不过根据\(cx + cy\)奇偶性的不同,路径的方向可能会是原图的镜像,但是计算方法是相似的。

G. Maximize the Remaining String

最后的结果就是\(s\)的字符集的某个排列。

考虑贪心,每次枚举尚未用到的字符,从中选一个可行且最大的,将其加入答案的末尾。不断重复至用完所有字符。

判断可行

假设现在的字符串为\(s\),当前枚举到的字符为\(target\)

选择\(s\)中的一个\(target\),那么其之前的任何字符都需要被删去,且其之后的\(target\)也要报删去。易得:此时选择第一个\(target\)会比选择其他\(target\)更优。

完成操作之后,新字符串的字符集只比原串字符集少掉一个\(target\),则表示\(target\)可行。

posted @ 2021-03-26 18:56  _Backl1ght  阅读(251)  评论(0编辑  收藏  举报