2019 Multi-University Training Contest 9
Contest Info
[Practice Link](https://cn.vjudge.net/contest/322367#overview)
Solved | A | B | C | D | E | F | G | H | I | J | K |
---|---|---|---|---|---|---|---|---|---|---|---|
6/11 | Ø | O | O | - | O | O | O | - | - | - | - |
- O 在比赛中通过
- Ø 赛后通过
- ! 尝试了但是失败了
- - 没有尝试
Solutions
A - Rikka with Quicksort
题意:
给出\(n, m\),计算\(g_m(n)\),\(g_m(i)\)定义如下:
思路:
我们令\(a_n = g_m(n)\), \(S_n = \sum\limits_{i = 1}^n a_i\),那么有:
那么有:
两式相减得到:
我们令\(\frac{2(n - 1)}{n(n + 1)} = \frac{a}{n} + \frac{b}{n + 1}\),那么解出来\(a = -2, b = 4\),令\(b_n = \frac{a_n}{n + 1}\)所以:
那么显然\(b_{m + 1}\)很容易通过题目中的式子得到是\(\frac{m}{m + 2}\)。
那么我们考虑:
那么代入有:
对于\(\sum\limits_{i = 1}^n \frac{1}{i}\)可以分段打表。
B - Rikka with Cake
题意:
在一个\(n \cdot m\)的矩阵中有一些射线,问这些射线将矩形分成多少块区域。
思路:
我们先考虑每一条横着的射线,因为题目保证了没有横跨整个矩形的射线,所以这些横着的射线并不会划分出多的区域。
那么考虑一条竖的射线,我们发现每加入一条射线,如果与某条横着的射线相交了,那么就会多一个区域。
也就是说一条竖线的贡献就是其与横线的交点个数。
那么就是一个经典的扫描线问题。
C - Rikka with Mista
题意:
有\(n\)个数,每个数有\(\frac{1}{2}\)的概率选或者不选,问所有的\(2^n\)的情况中,选的数的和以十进制表示中有多少个\(4\)。
思路:
考虑折半搜索一下,再考虑合并枚举其中一半,再枚举每一个十进制位,然后考虑当前这个十进制位为\(4\)的方案数。
E - Rikka with Game
题意:
有一个字符串,两个人玩游戏,每个人在他那一轮可以有两种操作:
- 终止游戏
- 选择其中一个字符,将其按照这样的规则变换:
- \(a \rightarrow b, b \rightarrow c, \cdots y \rightarrow z, z \rightarrow a\)
\(A\)想要字符串的字典序最小,\(B\)想要字符串的字典序最大,两个人都最优操作,问最后字符串会变成什么样。
- \(a \rightarrow b, b \rightarrow c, \cdots y \rightarrow z, z \rightarrow a\)
思路:
考虑如果一段前缀是'y'的话,那么两个人谁都不会去动这段前缀'y'。
那么考虑第一个非'y'的字母,如果它是'z',那么先手会将它变成'a',后手再将它变成'b',先手再终止游戏。
否则,先手直接终止游戏。
F - Rikka with Coin
题意:
有四种硬币:\(10\)分,\(20\)分, \(50\)分,\(100\)分,问最少带几个硬币,使得给出的\(n\)个数\(w_i\)都可以被拼出来。
思路:
考虑两种\(50\)肯定不如一张\(50\)一张\(100\)优。
所以我们考虑对于成百的,尽量都用\(100\)去组成它的百位及以上的部分。
但是这样会有问题,比方说这组数据:
12
10 20 30 40 50 60 70 80 90 100 160 200
这里面的\(200\)是可以用一张\(100\)和其余的散的拼出来的,这样答案更优。
所以我们在小范围暴枚的时候,判断能不能用散的拼出\(100\),如果可以,那么\(100\)的张数就可以减少\(1\)
G - Rikka with Travels
题意:
有一棵树,定义\(L(s, t)\)函数为\(s \rightarrow t\)简单路径上的点的数量。
现在要求任意挑选两条不相交的路径,他们的\(L\)函数会构成一个二元组\((L(a, b), L(c, d))\),问所有可行的选法中会生成多少个不同的二元组。
思路:
考虑两条不相干的路径肯定能以某一条边划分成两棵树,使得这两条路径分别是两棵树中的路径。
那么我们考虑枚举每一条边,那么划分出的两个数,他们能提供的最大路径长度肯定是他们的直径。
那么直接用这两个直径去更新答案即可。
枚举每条边划分出两棵树后,如何求直径?
显然不能直接求,但是我们可以考虑合并。
两棵子树的直径合并就是他们各自的直径的两个端点的两两组合中的一种。
那么对于一棵子树,维护其儿子的前缀直径,以及后缀直径,就可以方便的合并,再换根\(DP\)即可。