Codeforces Round #710 (Div. 3) 题解(A-G)
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
,且符合条件的最小代价。
那么有:
为了满足条件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\)可行。