1 条题解

  • 0
    @ 2026-4-4 16:12:14

    我们仔细分析一下这道题。


    题意理解

    已知原来有一个长度为 2n+12n+1 的数组 aa,满足:

    1. 所有元素两两不同。
    2. $a_1 = a_2 - a_3 + a_4 - a_5 + \dots + a_{2n} - a_{2n+1}$。
    3. 所有 aia_i 是正整数 1018\le 10^{18}

    现在有人删掉 aa 中的某一个元素(下标未知),然后把剩下的 2n2n 个元素打乱成 bb

    我们需要恢复出 aa 的一个可能序列。


    分析

    把原来的等式写成:

    $$a_1 + a_3 + a_5 + \dots + a_{2n+1} = a_2 + a_4 + \dots + a_{2n} $$

    记奇数位置的和为 SoddS_{\text{odd}},偶数位置的和为 SevenS_{\text{even}},那么有:

    Sodd=SevenS_{\text{odd}} = S_{\text{even}}

    并且 a1a_1 既在奇数位置中,又出现在方程左边。

    但已知的只有 bb(缺少一个元素),不知道被删掉的是奇数位置还是偶数位置,也不知道是哪一个。


    关键观察

    如果把 aa 全部元素加起来:

    $$\text{sum}(a) = S_{\text{odd}} + S_{\text{even}} = 2 S_{\text{even}} $$

    所以 原数组总和是偶数。而且 Seven=sum(a)/2S_{\text{even}} = \text{sum}(a)/2

    另外,SevenS_{\text{even}} 的取值刚好是“所有偶数位置元素的和”,它是 bb 中一些元素加上可能的缺失元素的和。

    因此:
    如果我们假设缺失元素是 xx,那么 SevenS_{\text{even}} 必须能表示为 bb 中某 nn 个元素(即偶数位置元素)的和。


    更具体地说:
    设缺失的元素为 xx,则 bb 包含的 2n2n 个元素分成两类:

    • 偶数位置的 nn 个元素(和为 SevenS_{\text{even}}
    • 奇数位置的 n+1n+1 个元素去掉 a1a_1 后剩下的 nn 个(和为 Sodda1S_{\text{odd}} - a_1

    但是 Sodd=SevenS_{\text{odd}} = S_{\text{even}},所以 Sodda1=Sevena1S_{\text{odd}} - a_1 = S_{\text{even}} - a_1

    因此 bb 中的数可以分成两组,每组 nn 个,其中一组的和等于 SevenS_{\text{even}},另一组的和等于 Sevena1S_{\text{even}} - a_1,并且 a1a_1 是被删除的那个数,不在 bb 中。


    构造思路

    1. bb 排序。
    2. 枚举被删除的数 xx(应该是一个很大的数,因为 a1a_1 在等式中可以很大,不是必须取 bb 中的数)。
    3. 如果我们确定 Seven=TS_{\text{even}} = T,那么 TT 必须是 bb 中某些元素的和(恰好 nn 个元素)。
    4. 由于 bb 中每个数必须恰好属于一个组(奇数位置组或偶数位置组),且两组大小都是 nn,所以 TT 一定等于 (sum(b)+x)/2(sum(b) + x) / 2,因为 sum(a)=sum(b)+xsum(a) = sum(b) + x,而 sum(a)=2Sevensum(a) = 2 S_{\text{even}},所以 Seven=(sum(b)+x)/2S_{\text{even}} = (sum(b) + x)/2
    5. 因此 sum(b)+xsum(b) + x 必须是偶数,且 SevenS_{\text{even}} 必须是整数。
    6. xx 可以取任意不在 bb 中的值吗?需要满足 TT 能用 bb 中的 nn 个元素表示,且剩下的 nn 个元素和是 Ta1T - a_1,其中 a1a_1 就是 xx

    所以 Tx=剩下元素的和T - x = \text{剩下元素的和}


    算法步骤

    已知:

    • bb 的总和 = BB
    • 设缺失的元素为 xx(未知)。
    • Seven=(B+x)/2S_{\text{even}} = (B + x) / 2
    • Sodd=SevenS_{\text{odd}} = S_{\text{even}}
    • 奇数位置包含 a1=xa_1 = x,以及 bb 中某些元素,这些元素的和为 SevenxS_{\text{even}} - x

    我们需要从 bb 中选出 nn 个数,和为 SevenS_{\text{even}}(偶数位置组),剩下 nn 个数和为 SevenxS_{\text{even}} - x(奇数位置组除了 xx 外的数)。

    同时奇数位置组的 nn 个数可以随意排列(和 bb 剩下的部分一样)。

    所以构造方法:

    1. xx 为某个数,使得 Seven=(B+x)/2S_{\text{even}} = (B + x)/2 是整数。
    2. 检查能否从 bb 中找出 nn 个数和为 SevenS_{\text{even}}
    3. 如果找到了,那么剩下的 nn 个数自动和为 SevenxS_{\text{even}} - x,这是奇数位置组(不含 xx)。
    4. 输出奇数位置组(任意顺序),中间插入 xx 作为 a1a_1,然后偶数位置组按任意顺序放在 a1a_1 后面,形成 a2,a3,,a2na_2, a_3, \dots, a_{2n} 的任意顺序。

    注意:奇数位置组(不含 xx)有 nn 个元素,偶数位置组也有 nn 个元素。交替排列即可得到序列 aa,其中 a1=xa_1 = x


    如何找 xx

    有一个简单构造:
    x=max(b)+1x = \max(b) + 1(或者任意大的数),这样 Seven=(B+x)/2S_{\text{even}} = (B + x)/2 很大,而 bb 中最大数 109\le 10^9,所以 SevenS_{\text{even}} 很大,SevenS_{\text{even}} 不可能等于 bb 中任意 nn 个数的和(因为 nn 个数和最大 n109<B/2+x/2n \cdot 10^9 < B/2 + x/2 如果 xx 太大),所以不好。

    实际上我们需要 SevenS_{\text{even}}bbnn 个数的和,所以 Sevennmax(b)S_{\text{even}} \le n \cdot \max(b)
    因此 (B+x)/2nmax(b)(B + x)/2 \le n \cdot \max(b)
    x2nmax(b)B\Rightarrow x \le 2n \max(b) - B

    因为 Bnmin(b)B \ge n \cdot \min(b),所以 xx 有一个上界,不一定要取大数。

    但更简单的方法:
    我们从 bb 中选 nn 个数作为偶数位置组,它们和 TT 确定,那么 x=2TBx = 2T - B 是被删除的数,需要 x>0x > 0xx 不在 bb 中,并且 xx 可以很大(只要 1018\le 10^{18})。

    所以算法:

    1. bb 排序,设 SSbb 总和。
    2. 取最大的 nn 个数之和作为 TT(这样 TT 很大,xx 很大,容易满足条件,且 TT 可以构造出来)。
    3. 检查 x=2TSx = 2T - S 是否不在 bb 中且为正数。
    4. 如果 xxbb 中,尝试次大的 nn 个数和,直到找到可行解(因为 bb 里数互异,总会找到一个 xx 不在 bb 中)。

    这样构造的 a1=xa_1 = x,奇数位置组:bb 中剩下的 nn 个数,偶数位置组:选出的 nn 个数。输出顺序:xx,然后交错输出奇数位置组和偶数位置组(先输出偶数位置组的一个数,再输出奇数位置组的一个数,等等),这样奇偶位置的和满足要求。


    实现

    我们可以简单取 T=最大的 n 个数之和T = \text{最大的 } n \text{ 个数之和},设 x=2TSx = 2T - S,如果 xx 不在 bb 中且 x>0x > 0,则成功;否则,依次减小 TT(比如把最大数换小一点),直到找到可行的 xx

    由于 nn 不大(总和 21052\cdot 10^5),可以用 multiset 或双指针找。


    示例验证

    例1:
    b=[9,2],n=1,S=11b = [9, 2], n=1, S=11
    最大 n=1n=1 个数是 99T=9T=9x=2911=7x = 2\cdot 9 - 11 = 7(不在 bb 中)
    偶数位置组:[9][9],奇数位置组:[2][2]
    输出:a=[7,9,2]a = [7, 9, 2] 符合样例。

    例2:
    b=[8,6,1,4],n=2,S=19b = [8, 6, 1, 4], n=2, S=19
    最大 n=2n=2 个数:8+6=148+6=14x=2819=9x=28-19=9(不在 bb 中)
    偶数位置组:[8,6][8,6],奇数位置组:[1,4][1,4]
    输出 a=[9,8,1,6,4]a=[9, 8, 1, 6, 4](交错) 符合样例。

    • 1

    信息

    ID
    6356
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者