「JOI 2018 Final」毒蛇越狱 题解

Description

传送门

Solution

这题神了。

为方便叙述,令 a i a_i ai 表示第 i i i 只蛇的毒性, F i = ∑ j ∈ i a j F_i=\sum_{j \in i} a_j Fi=jiaj G i = ∑ i ∈ j a j G_i=\sum_{i \in j}a_j Gi=ijaj,其中 x ∈ y x \in y xy 表示 x x x y y y 的子集;令某次询问中 ? x x x 个,0 y y y 个,1 z z z 个。

Part 1: 暴力

一种朴素的做法是,暴力枚举每个 ? 填上 0 0 0 还是 1 1 1

时间复杂度 O ( 2 x ) O(2^x) O(2x)

Part 2: 对 0 0 0 容斥

考虑对 0 0 0 进行容斥: 钦定一些 0 0 0 不满足要求(也就是说在该位上填 1 1 1 而非 0 0 0),剩下的 0 0 0 看做 ?;显然,各种情况的方案数乘容斥系数之和即为答案。

不难发现,方案数就是 G m a s k G_{mask} Gmask,其中 m a s k mask mask 表示 ⌈ \lceil 所有钦定不满足要求的位置集合 s s s ⌋ \rfloor ⌈ \lceil 所有原来就已经固定为 1 1 1 的位置集合 ⌋ \rfloor 的并集,容斥系数就是 ( − 1 ) ∣ s ∣ (-1)^{|s|} (1)s

时间复杂度 O ( 2 y ) O(2^y) O(2y)

Part 3: 对 1 1 1 容斥

与 Part 2 同理,钦定一些 1 1 1 不满足要求。方案数就是 F m a s k ′ F_{mask'} Fmask,其中 m a s k ′ mask' mask 表示 ⌈ \lceil 所有没有钦定不满足要求的位置集合 ⌋ \rfloor ⌈ \lceil 所有原来填有 ? 的位置集合 ⌋ \rfloor 的并集,容斥系数就是 ( − 1 ) ∣ s ′ ∣ (-1)^{|s'|} (1)s

时间复杂度 O ( 2 z ) O(2^z) O(2z)


综上所述,我们将 x , y , z x,y,z x,y,z 排个序;若 x x x 最小那么调用 Part 1,若 y y y 最小那么调用 Part 2,若 z z z 最小那么调用 Part 3。

注意到 x + y + z = n x+y+z=n x+y+z=n,所以 min ⁡ ( x , y , z ) ≤ ⌊ n 3 ⌋ \min(x,y,z) \le \lfloor \frac n 3 \rfloor min(x,y,z)3n,总复杂度 O ( 2 n n + q 2 ⌊ n 3 ⌋ ) O(2^n n+q2^{\lfloor \frac n 3 \rfloor}) O(2nn+q23n),可以通过本题。

Code

提交记录

猜你喜欢

转载自blog.csdn.net/Cherrt/article/details/121360670