AtCoder Beginner Contest 190 题解(A-F)

AC代码

A - Very Very Primitive Game

如果\(c = 1\),就让B操作,然后就又变成A先手操作了。

A先手操作时,仅当\(a > b\)时先手胜。

B - Magic 3

遍历一遍,没什么好说的。

C - Bowls and Dishes

注意到\(k \le 16\),所以可以暴力枚举第\(i\)个人是往\(c_i\)放球还是往\(d_i\)放球。

D - Staircase Sequences

首先,首项,公差以及项数这三个参数可以确定一个等差数列。题目中已经确定了公差为\(1\).

\(a_0\)为首项,公差为\(1\),长度为\(n\)的和为\(N = \frac{(a_0 + a_0 + n - 1)n}{2} = n(a_0 + \frac{n - 1}{2}) = \frac{n}{2}(2a_0 + n - 1)\)

又因为\(N, n, a_0\)均需为整数,所以,可以枚举\(N\)的所有因子,并判断每个因子是否可以作为\(n\)或者\(\frac{n}{2}\),若可以就将对应的\(n\)加入集合。

集合的大小即为答案。

E - Magical Ornament

\(c_i, 1\le i \le k\)作为关键点。\(k\)次BFS(或者Dijkstra)可以跑出关键点间的多元多汇最短路,记\(f_{i,j}\)\(c_i\)\(c_j\)的最短路长度。

然后就是一个类似bitmask DP求解TSP的过程。大概意思就是枚举所有可能的关键点出现顺序。

\(dp_{mask,i}\)表示已经经过了\(mask\)标记的关键点,最后一个出现的关键点为\(c_i\)的最短序列长度。仅包含一个关键点的序列最短长度显然为\(1\)

然后就可以借助

\[dp_{mask, i} = \min_{i \in mask} \min_{j \in pre} dp_{pre, j} + f_{j, i} \]

转移。其中,\(pre\)\(mask\)集合去掉\(i\)

F - Shift and Inversions

首先,可以借助树状数组求出\(k = 0\)时的逆序数,记为\(I\)。这个是树状数组的经典应用,不再赘述。

然后,让\(k\)加一,相当于将首元素移动到末尾,也相当于先删除后添加。

删除首元素,数组的逆序数减少的数量等于剩余元素中小于首元素的元素数量。由于这里的数组是排列,所以若首元素为\(x\),那么删除首元素后,数组的逆序数要减少\(x\)

在结尾添加原首元素,那么数组的逆序数增加的数量相当于其余元素中大于原首元素的元素数量。由于这里的数组是排列,所以若原首元素为\(x\),那么在结尾添加原首元素后,数组的逆序数要增加\(n - x\)

注意这里的排列是1-based的。

所以每次让\(k\)加一,\(I^\prime = I - x + (n - x - 1)\)

posted @ 2021-01-31 00:48  _Backl1ght  阅读(105)  评论(0编辑  收藏  举报