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)\)

posted @ 2025-09-16 09:30  lxllxs  阅读(22)  评论(0)    收藏  举报