A. Strange Table
不妨假设表中的数字从(0)开始,且行列也从(0)开始。
此时数字(x)在按列排时位于((lfloor frac{x}{n} floor, x ext{ 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} floor)。
假设当前位于((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)可行。