Educational Codeforces Round 83
A. Two Regular Polygons
Solution
原问题等价于 $m$ 能否整除 $n$.
Code
1 |
|
B. Bogosort
Solution
倒序排序即可。
Code
1 |
|
C. Adding Powers
Solution
把每一个数表示成 $k$ 进制数,若不能表示成 $k$ 进制或有两个 $k$ 进制数同时存在某一位,输出 NO
。
Code
1 |
|
D. Count the Arrays
Solution
推一波式子。
枚举最高点 $k$,设其值为 $r\ (n-1\leq r\leq m)$,则从 $1\sim r-1$ 中选出 $n-2$ 个数,有 $C_{r-1}^{n-2}$ 种选法;然后从这 $n-2$ 个数之中选一个数重复一遍,有 $C_{n-2}^1$ 种选法;现在得到了 $n-1$ 个数($1$ 个重复),从除开重复的 $n-3$ 个数中选 $k-2$ 个放在 $k$ 之前,其余的自然放在 $k$ 之后,共 $C_{n-3}^{k-2}$ 种选法。故答案为:
组合数预处理阶乘及其逆元即可。
Code
1 |
|
E. Array Shrinking
Solution
区间 dp. 设 $dp[i][j]$ 表示 $a[i\cdots j]$ 的最小长度,那么枚举中间的断点进行转移:$dp[i][j]=dp[i][k]+dp[k+1][j]$(不考虑合并);我们只在 $dp[i][k]=dp[k+1][j]=1$ 且可以合并的情况下考虑合并,因为所有的合并都一定可以拆成若干长度为 $1$ 的项的合并。
Code
1 |
|
F. Attack on Red Kingdom
G. Autocompletion
Solution
题目的输入方式其实自然构成了一棵 Trie 树。我们按字典序 $dfs$ 这棵 Trie 树,维护每个点的答案。具体的,当前点的答案至少是上一个点的答案 $+1$(即在上一个点之后输入一个字符);然后如果当前点在 $S$ 中,它也有可能来自其某个祖先的 autocompletion,考虑怎么处理这部分。
我们对每个点记录它的列表中第一个还没被遍历到的点是列表的第几个点,所以初始情况是所有点的记录均为 $1$。随后,凡遍历到一个 $S$ 中的点,就将它的所有祖先以及它自己的记录 $+1$,表示以后的点想要使用 autocompletion 功能时,必须要在列表中花费一秒走过这个点;由于我们是按照字典序遍历的,所以这些 $+1$ 累加起来就是走过已经遍历过的点一共需要花费的时间。处理完当前点之后,把当前点答案加入记录,意思是从这个点往下转移时先要加上到达这个点的时间。这样遇到下一个 $S$ 中的点时,用其所有祖先的最小记录值更新答案即可。
上述过程涉及到区间加与区间求最小值,可以开线段树做。线段树的下标选用树的深度最为方便(用 $dfs$ 序也可,实现上稍微麻烦一点)。
Code
1 |
|
Educational Codeforces Round 83
http://xyfjason.github.io/blog-xcpc/2020/03/10/Educational-Codeforces-Round-83/