抱歉,您的浏览器无法访问本站

本页面需要浏览器支持(启用)JavaScript


了解详情 >

比赛地址

AB 就不写了。

C - Successive Subtraction

题意

\(N\) 个数,执行 \(N-1\) 次操作,每次选择两个数 \(x,y\),删去这两个数,替换成 \(x-y\)。求最后结果的最大值并构造方案。

\(N\le 10^5\)

题解

最后一定是给每个数一个正负号后加起来的结果。

显然,全部填正号或全部填负号一定不可行。而同时有正负时,记其中一个填正号的数是 \(a\),填负号的数是 \(b\),那么我们可以用 \(b\) 减去其他填正号的数,再用 \(a\) 减去该数,最后再减去其他填负号的数。

所以我们只要将所有正数填上正号,所有负数填上负号即可,需要注意全正和全负的情况。

代码

D - Squirrel Merchant

题意

一开始有 \(N\) 个球,有两个商店 A、B。在商店 \(X\) 交易时,可以按任意顺序执行任意次以下交换(交换是双向的):

  • 交换 \(g_X\) 个球与 \(1\) 单位的金。
  • 交换 \(s_X\) 个球与 \(1\) 单位的银。
  • 交换 \(b_X\) 个球与 \(1\) 单位的铜。

你可以按顺序在商店 A,商店 B,商店 A 进行交易。

求最后最多有多少球。

\(N,g_A,s_A,b_A,g_B,s_B,b_B\le 5000\)

题解

我们可以把问题看成先用 \(N\) 个球依次在 A 和 B 交易,全部换成球,得到 \(M\) 个球,然后再用这 \(M\) 个球依次在 B 和 A 交易,再全部换成球,就是答案。

这两步的问题是一样且独立的,而每一步的问题相当于一个完全背包问题。直接 DP 即可。

时间复杂度 \(O(N^2)\)

代码

E - Balanced Piles

题意

\(N\) 个初始为 \(0\) 的整数,每次可以执行以下操作:

  • \(N\) 个数中的最小值为 \(m\),最大值为 \(M\)。选择任意一个等于 \(m\) 的数,加上一个正整数,使得该数在 \([M,M+D]\) 中。

你的目标是使所有数都变成 \(H\)。求操作方案数,对 \(10^9+7\) 取模。

\(N,D,H\le 10^6\)

题解

\(f_{i,j}\) 表示当前最大值为 \(i\),有 \(j\) 个时的操作方案数。

注意到此时转移与最小值有关,貌似并不能转移。

但是考虑到这 \(j\) 个最大值在接下来的某段操作中会变成最小值,而在这一段操作中,因为我们确定了每一次操作后的最大值,所以这 \(j\) 个最大值的贡献是 \(j!\)

于是我们有 \[ f_{i,j}= \begin{cases} \sum\limits_{k=1}^d\sum\limits_{l=1}^{n} f_{i-k,l} & \text{ if }j=1\\ f_{i,j-1}\cdot j & \text{ if }j>1 \end{cases} \]

也就是说我们有 \(f_{i,j}=f_{i,1}\cdot j!,f_{i,1}=\sum\limits_{k=1}^{d}f_{i-k,1}\sum\limits_{l=1}^{n}l!\)

所以只记录 \(f_{i,1}\),用前缀和优化转移即可。

注意 \(i=0\) 时,只有 \(f_{i,n}=n!\),其他位置都是 \(0\),所以最后答案需要乘上 \(\frac{n!}{\sum\limits_{i=1}^{n}i!}\) 去掉其他位置的贡献。

代码

F - Diverta City

题意

给一个 \(n\) 个点的无向完全图的每条边确定一个权值,使得所有 \(\frac{n!}{2}\) 条本质不同的哈密顿路权值不同。

\(n\le 10\)

题解

构造一个序列 \(f=\{1, 2, 4, 7, 12, 20, 29, 38, 52\}\),这个序列满足所有元素以及所有元素两两的和都互不相等。

考虑每次加入一个点 \(i\),对于所有 \(j < i\),将 \((i,j)\) 这条边的边权置为 \((M+1)f_j\),其中 \(M\) 表示前 \(i-1\) 个点的所有哈密顿路权值的最大值。

这样构造显然是正确的。证明可以考虑在任意两条哈密顿路中的任意位置插入 \(i\),因为乘了 \((M+1)\),原来哈密顿路的权值以及减去的边的权值都不需要考虑,而只需要考虑加入的两条边。因为乘了 \(f_i\),这些边具有了 \(f\) 的性质,即所有元素以及所有元素两两的和都互不相等,所以这些新的哈密顿路权值一定都互不相等。

代码

评论