1 条题解

  • 1
    @ 2025-2-3 14:07:32

    X8G 俄罗斯蓝猫 题解

    比较简单的做法。

    满分做法要求:

    • 5n5005\le n\le 500
    • 不超过两次询问
    • 每次询问不超过 n1n-1 个二元组
    • 不能重复询问一个二元组多次
    • 二元组两个元素不能相同

    不妨先满足条件一二五,放宽条件三四,因为条件一二五不好卡,条件三四可以卡。

    两次询问容易想到一次菊花一次环,二元组数量分别为 n1n-1nn

     

    做法一

    菊花1i<n\forall1\le i<n,询问 (0,i)(0,i)

    1i<n\forall1\le i<n,询问 (i1,i)(i-1,i),另外再询问 (0,n1)(0,n-1)

    通过菊花的返回值,容易获知 (n2)a0+ai(n-2)a_0+\sum a_i

    通过环的返回值,容易获知 ai\sum a_i

    这两个值可以进一步得到 a0a_0{a1,,an1}\set{a_1,\dots,a_{n-1}}

    由于 n500n\le 500 对于 [0,1018][0,10^{18}] 的值域十分稀疏,可以认为任意两个数的和不会相同。

    {a1,,an1}\set{a_1,\dots,a_{n-1}} 中枚举 a1a_1,判定标准就是 a0+a1a_0+a_1 出现在环的返回值中,紧接着就可以枚举确定 a2a_2,依次类推。

    此做法时间复杂度 O(n2)O(n^2)。存在的问题是:在第一次枚举中可能枚举到 an1a_{n-1},导致 a1an1a_1\sim a_{n-1} 整体翻转。

     

    做法二

    为了对 a1a_1an1a_{n-1} 加以区分,稍稍修改询问,并使其满足条件三。

    菊花1i<n\forall1\le i<n,询问 (0,i)(0,i)

    1i<n\forall1\le i<n,询问 (i1,i)(i-1,i)

    环的询问被改为链的询问。信息 ai\sum a_i 仍然是必需的,所以可以在菊花的返回值中枚举哪一个返回值对应着 a0+an1a_0+a_{n-1}。随后再套用做法一。

    此做法时间复杂度 O(n3)O(n^3)。存在的问题是:二元组 (0,1)(0,1) 在两次询问中同时出现了。

     

    做法三

    在菊花的询问中去掉 (0,1)(0,1),使其满足条件四。

    菊花2i<n\forall2\le i<n,询问 (0,i)(0,i)

    1i<n\forall1\le i<n,询问 (i1,i)(i-1,i)

    再模仿做法二解决问题的办法绕一步:在链的返回值中枚举哪一个返回值对应着 a0+a1a_0+a_1。随后再套用做法二。

    此做法时间复杂度 O(n4)O(n^4)

    可以加点剪枝。注意到 a0a_0 有整数解的条件为 (n2)a0+aiai(n-2)a_0+\sum a_i-\sum a_in2n-2 的倍数。这个条件随机情况下成立的概率很小,所以实际效率类似于时间复杂度 O(n3)O(n^3)

    • 1

    信息

    ID
    115
    时间
    7500ms
    内存
    512MiB
    难度
    9
    标签
    递交数
    161
    已通过
    16
    上传者