1 条题解

  • 1
    @ 2024-1-30 18:58:15

    考虑 jkj \to k 连有向边,形成基环树森林。

    容易发现最关键的是选择一个环,那么剩下的边都可以直接接上去。因此只需要找到一个环即可。

    那么这个时候,一些 aia_i 是顺时针的,一些 aia_i 是逆时针的,考虑把逆时针的几个取负,相加,得到和为 00

    因此转化为经典的相同子集和问题:试选择两个不同的无交子集,使得和相同。这显然要限制范围。

    鸽巢原理,解 2BB106+12^B \geq B\cdot 10^6 + 1,取 B=25B = 25 发现可行,也即 nBn \geq B 一定有解。找相同子集和时,令 nmin(n,25)n \gets \min(n, 25)

    UPD:事实上,我才疏学浅,只能构造出大小为 2121 的不可行解。如果有能够构造出大小 [22,24]\in [22, 24] 的人,可以联系我,也许我会提供神秘奖励(。

    • Solution 1:背包

    考虑 dp,设 fi,jf_{i,j} 表示前 ii 个数的子集和可否为 jj,如果一个 true\tt{true} 被第二次转移到就得到了解。用 bitset 优化过程

    jj 的上界是 $\lfloor \frac n2 \rfloor \cdot 10^6 = \mathcal O(V\log V)$。时间复杂度,渐进意义为 O(TVlog2Vw)\mathcal O(T\frac{V\log^2 V}{w}),可以通过。时限大致是 3 倍 std 复杂度。

    • Solution 2:双向搜索

    考虑分成每部大小 13\leq 13 的两部分,直接每一部分 3n3^n 搜索可能的子集和,最终 map 查询是否相同即可。

    时间复杂度的渐进意义为 O(T(1.7321)BB)\mathcal O(T(1.7321)^B \cdot B)可以通过。实测取 B=25B = 25 根本过不去,于是面向出题人的构造水平取了 B=22B = 22,跑了 1.7s 左右,合理推断如果能构造出来 n=23n = 23 的无解数据这个做法就没了。


    轻度卡常。

    • @ 2024-1-30 19:07:40

      irris 大神太强了。

  • 1

信息

ID
793
时间
3000ms
内存
256MiB
难度
5
标签
递交数
115
已通过
4
上传者