E. Sets of Complementary Sums 个人题解(Educational Codeforces Round 181)
转化题意
题意表述的内容不是很形象,考虑将其形式化的表述,假设集合 \(Q\) 里的元素为 \(b_i\),原数组的元素为 \(a_i\),由于集合 \(Q\) 里的数两两不同,根据其定义,相同的 \(a_i\) 会产生同一个 \(b_i\),所以引入一个参数 \(c_i\),表示每个不同的 \(a_i\) 的出现次数,转化一下题意即:
求有多少个大小为 \(n\) 的集合 \(b\) 满足:
-
\(1\leq b_1<b_2<b_3\dots<b_n\leq x\)
-
\(S=\displaystyle\sum_{i=1}^n c_ia_i\),其中 \(c_i\geq1\),\(a_i\geq1\)
-
对于任意的 \(1\leq i\leq n\),满足 \(S=a_i+b_i\),显然的: \(S\geq b_n+1\)
构造结论
我们先考虑次一级的问题,给定一个集合 \(b\),如何判断其是否有解
将第三个条件带入第二个条件,可得:\(S=\displaystyle\sum_{i=1}^n c_i(S-b_i)\)
尝试在这个等式上推导一般性的结论,没什么收获,考虑根据特征构造一个特殊性的结论出来。
可以注意到 \(c_i\) 这个参数是可以任意调整的,我们可以根据这个特征将一个 \(c_i\) 独立出来,将等式转化为不等式。
我们令 \(S=b_n+1\),带入式子可得 \(b_n+1=c_n+\displaystyle\sum_{i=1}^{n-1} c_i(b_n+1-b_i)\)
我们可令 \(c_i\)(\(1\leq i\leq n-1\))全部为 \(1\),等价于求解不等式 \(\displaystyle \sum_{i=1}^{n} (b_n+1-b_i)\leq b_n+1\),其中缺少的部分完全可以由 \(c_n\) 补齐。
可以证明,我们完全可以将原问题转化为求解这个不等式。
证明如下:
我们现在需要证明如果在 \(S=b_n+1\) 时如果无解,那么在 \(S>b_n+1\) 依然无解
在 \(S=b_n+1\) 无解的情况下,根据上面的式子,有 \(\displaystyle \sum_{i=1}^{n} (S-b_i)> S\) (\(S=b_n+1\))
如果让 \(S+k\),不等号左边 \(+kn\),不等号右边 \(+k\),显然有 \(\displaystyle \sum_{i=1}^{n} (S-b_i)> S\) (\(S>b_n+1\))
由此可以确定 \(S=\displaystyle\sum_{i=1}^n c_i(S-b_i)\) 在 \(S>b_n+1\) 时无解
考虑DP
到这一步,已经可以设想后面的求解算法了,我们可以去枚举 \(b_n\),每次就是从一个非重集合内取一个大小为 \(n-1\) 的子集,使得其总和不超过一个值,用 dp 可以做,详细的:
我们令\(f_i=b_n-b_i\),转化一下式子:\(\displaystyle \sum_{i=1}^{n-1} f_i\leq b_n-n+1\),其中集合 \(f\) 就是集合 \(\{1,2,3\dots b_n-2,b_n-1\}\) 的子集
很直接的关于 dp 的状态定义是 \(dp_{i,j,k}\) 表示前 \(i\) 个数中取出 \(j\) 个数,其中和为 \(k\) 的方案数
但这个 dp 状态数是 \(nx^2\) 的,需要重构一下dp状态
可以发现,在 \(n\geq2\) 时, \(b_n-1\geq b_n-n+1\),这个问题其实就是个完全背包,不用考虑是从哪个部分里取数,直接从全集里取数就可以了。即我们考虑的是全集 \(\{1,2,3\dots\}\) 的子集 \(f\)。
那就可以重构dp了,定义 \(dp_{i,j}\) 表示从全集里取出 \(i\) 个数,和为 \(j\) 的方案数,转移方程:
- 如果当前集合最小值不为1,我们令所有数减一,集合大小不变,总方案数不变,即 \(dp_{i,j}\leftarrow dp_{i,j-i}\)
- 如果当前集合最小值为1,我们令所有数减一,集合大小减一,总方案数不变,即 \(dp_{i,j}\leftarrow dp_{i-1,j-i}\)
求得了 \(dp_{i,j}\) 如何去计算答案?
所有的 \(dp_{n-1,i}\) 对答案产生贡献,其最小的合法 \(b_n'=i+n-1\),贡献为 \(dp_{n-1,i}\cdot(x-b_n'+1)\)
时间复杂度 \(O(nx)\),看起来依旧不能通过
分析状态数
切入点在于 \(n\) 和 \(x\) 的关系,当 \(n\) 足够大的时候,\(\displaystyle \sum_{i=1}^{n-1} f_i\geq \frac{n(n-1)}{2}\),不等式 \(\displaystyle \sum_{i=1}^{n-1} f_i\leq b_n-n+1\leq x-n+1\) 一定无解。
转化一下,即:\(\displaystyle \frac{n(n-1)}{2}> x-n+1 \Rightarrow \frac{(n+2)(n-1)}{2}>x\) 时,无解,答案为0
所以判掉这个情况后,\(n\) 的大小在 \(\sqrt x\) 级别,时间复杂度 \(O(x\sqrt x)\)。

浙公网安备 33010602011771号