Educational Codeforces Round 85
A. Level Statistics
Solution
显然,$p$ 和 $c$ 必须非降, $c$ 不大于 $p$ 且 $c$ 增幅不大于 $p$.
Code
1 |
|
B. Middle Class
Solution
从大到小排个序,不断把多的削成 $x$ 移给下一个即可。容易知道这样做其实和均分答案是相同的(可以削平成 $x$ 的数均分后一定也不小于 $x$,不能削平成 $x$ 的数均分后一定都小于 $x$)。
Code
1 |
|
C. Circle of Monsters
Soution
对于每个怪物来说,它的 $a$ 减去它前一个怪物的 $b$ 是一定需要我们开枪打死的血量,把它们加起来之后,枚举第一个打死的怪物,取代价最小者。
Code
1 |
|
D. Minimum Euler Cycle
Solution
路线一定是这样的:$[1,2,1,3,1,4,\cdots,1,n],[2,3,2,4,\cdots,2,n],[3,4,\cdots,3,n],\cdots,[n-1,n],1$(为了体现出规律,用括号把序列分段了)。所以根据该规律,给出位置 $x$,就能找到对应的数。
Code
1 |
|
E. Divisor Paths
Solution
【参考:dls的视频】
由于所有数都是 $D$ 的因数,设 $D$ 的质因数有 $k$ 个,那么把每个数质因数分解后可以看成一个 $k$ 维向量。$x$ 与 $y$ 之间有边表明这两个向量有且仅有一维差 $1$,于是原图其实是一个 $k$ 维空间的网格图。
设 $d(x)$ 表示 $x$ 的因数个数,那么对于路径 $a_1\rightarrow a_2\rightarrow\cdots\rightarrow a_l$,其长度就是 $d(a_l)-d(a_1)$. 考虑 $u,v$ 两点之间的最短路,发现应该是 $u\rightarrow gcd(u,v)\rightarrow v$ 这么一条路径。于是问题转化成如何求出 $u\rightarrow gcd(u,v)$ 和 $v\rightarrow gcd(u,v)$ 的路径数量,二者乘积就是答案。
这其实是一个多重集的排列数问题,对于 $n_1$ 个 $1$,$n_2$ 个 $2$,$\cdots$,$n_t$ 个 $t$,$n_1+\cdots+n_t=n$,排列总数是 $C(n;n_1,\cdots,n_t)=\frac{n!}{n_1!\cdots n_t!}$.
Code
1 |
|
F. Strange Function
Solution
【参考:dls的视频】
设 $dp[i][j]$ 表示考虑 $a$ 中前 $i$ 个数,匹配了 $b$ 中前 $j$ 个数的最小代价,则转移如下:
- 若 $b[j]==a[i]$,$dp[i][j]$ 可以从 $dp[i-1][j]$ 转移而来,代价加上 $\min(0,p[i])$(即可选可不选);也可以从 $dp[i-1][j-1]$ 转移而来,此时必选。
- 若 $b[j]>a[i]$,$dp[i][j]$ 从 $dp[i-1][j]$ 转移而来,代价加上 $\min(0,p[i])$(即可选可不选)。
- 若 $b[j]<a[i]$,$dp[i][j]$ 从 $dp[i-1][j]$ 转移而来且 $a[i]$ 一定不能选,所以代价加上 $p[i]$。
$dp$ 数组的第一维可以滚掉,空间问题解决;转移无非就是区间加和单点查询,所以线段树维护 $dp$ 数组。
时间复杂度:$O(n\lg m)$
Code
1 |
|
Educational Codeforces Round 85
http://xyfjason.github.io/blog-xcpc/2020/04/11/Educational-Codeforces-Round-85/