Codeforces Round #786 (Div. 3)

A. Number Transformation

\(a = 1\),则\(b = \dfrac{y}{x}\)

B. Dictionary

暴力预处理出完整的字典,然后用std::map存单词和下标的映射。

C. Infinite Replacement

如果\(t\)等于a,则答案为\(1\)

否则,如果\(t\)包含a,则有答案为无穷大。

否则,\(s\)中的每个元素都有两种可能,替换或者不替换,即答案为\(2^n\),其中\(n = |s|\)

D. A-B-C Sort

先做了E,F才返回来做D。

对于\(n = 3\),所有可能的结果有\(a_1a_2a_3\)\(a_1a_3a_2\)

对于\(n = 4\),所有可能的结果有\(a_1a_2a_3a_4\)\(a_1a_2a_4a_3\)\(a_2a_1a_3a_4\)以及\(a_2a_1a_4a_3\)

以此类推,发现题目所给的操作等价于:当\(n - i\)为偶数的时候,可以交换\(a_i\)\(a_{i+1}\)

对于满足条件的\(i\),如果\(a_i > a_{i + 1}\),就交换两元素的位置,否则不变。

然后看数组是否是非降序即可。

E. Breaking the Wall

可能的操作共有3种:

  1. 砸第\(i - 1\)道墙和第\(i + 1\)道墙。
  2. 砸第\(i\)道墙和第\(i + 1\)道墙。
  3. 砸第\(i\)道墙和第\(j\)道墙。

对于第一种操作,要么其中一个减2,要么两个都减1,代价为\(\lceil \dfrac{a_{i-1} + a_{i + 1}}{2} \rceil\)

对于第二种操作,可能砸其中一个能把另外一个顺便砸倒,以\(i\)为例,代价为\(\lceil \dfrac{a_i}{2} \rceil\);否则就列不等式方程组然后解方程算代价,可得代价为\(\lceil \dfrac{a_i + a_{i + 1}}{3} \rceil\)

对于第三种操作,\(j\)的选择可以贪心选,共有4个候选:\(i - 1\)\(i + 1\)\(p(i - 2)\)\(s(i + 2)\)\(p(x)\)表示下标小于等于\(x\)的元素中最小值所在下标,\(s(x)\)表示示下标大于等于\(x\)的元素中最小值所在下标。

F. Desktop Rearrangement

记桌面上的图标数量为\(count\)

由于行数和列数都是固定的,所以重排之后有图标的区域是可以直接算出来的。假设已经位于这个区域中的图标数有\(sum\)个,则还需要的操作数为\(count - sum\)

将桌面上的位置按下面这种方式重新编号。

147
258
369

重新编号之后,桌面重排之后图标的位置就会是一个前缀,然后就是单点修改+前缀的和问题了,直接树状数组搞定。

G. Remove Directed Edges

DAG上DP。

观察可得:最后的答案会是一条

假设\(dp_i\)表示以\(i\)为终点的链的最大长度。对于节点\(u\),考虑和他相邻的点\(v\)是否拓展以\(u\)为终点的链。

因为是链,所以除了边\(u \rightarrow v\)以外,\(u\)的其他出边和\(v\)的其他入边都可以删去,所以如果\(outdeg_u > 1\)\(indeg_v > 1\)的话,\(v\)就可以在\(u\)的基础上再拓展一。然后因为是DAG,所以对于\(v\)可能会有多个\(u\),即\(dp_v = \max dp_{(u, v) \in E} dp_u + 1\)

搞个拓扑排序,然后算DP即可。

posted @ 2022-05-03 02:36  _Backl1ght  阅读(205)  评论(8编辑  收藏  举报