CF2115D Gellyfish and Forget-Me-Not 题解

Description

Gellyfish 和 Flower 正在玩一个游戏。

该游戏包含两个长度为 nn 的整数数组 a1,a2,,ana_1,a_2,\ldots,a_nb1,b2,,bnb_1,b_2,\ldots,b_n,以及一个长度为 nn 的二进制字符串 c1c2cnc_1c_2\ldots c_n

还有一个整数 xx,初始值为 00

游戏进行 nn 回合。对于 i=1,2,,ni = 1,2,\ldots,n,每一回合如下进行:

  1. 如果 ci=0c_i = 0,那么 Gellyfish 是该回合的操作者。否则,如果 ci=1c_i = 1,那么 Flower 是该回合的操作者。

  2. 当前操作者必须执行以下两个操作之一:

    • x:=xaix := x \oplus a_i
    • x:=xbix := x \oplus b_i

这里, 表示按位异或操作

Gellyfish 希望使 xx 的最终值尽可能小,而 Flower 则希望使它尽可能大。

如果双方都采取最优策略,求 nn 回合后 xx 的最终值。

n105,0ai,bi<260n\leq 10^5,0\leq a_i,b_i<2^{60}

Solution

先让 bib_iresres 异或上 aia_i,现在相当于是选择一些 bib_iresres 异或上。

首先考虑只有一位怎么做。

容易发现最大的一个 bi=1b_i=1ii 可以控制这一位的最终取值,这一个 ii 的最终取值取决于 1i11\sim i-1 的所有 bj=1b_j=1 的位置选择数量的奇偶性。

对于位数不止 11 的情况,先找到 ii,由于 bib_i 的选择只跟其余 bj=1b_j=1 的选择数量奇偶性有关,所以让 bjbjbib_j\leftarrow b_j\oplus b_i 后对答案的没有影响,同时最高位就只有 ii11 了,可以通过 cic_iresres 在这一位的取值来确定现在的 bib_i 需不需要选。

由于 bib_i 的选法是固定的了,所以让 resres 异或上 bib_i 的选择后把 bib_i 删掉即可,然后对后面的位做同样的事情。

时间复杂度:O(nlogV)O(n\log V)

Code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#include <bits/stdc++.h>

#define int int64_t

const int kMaxN = 1e5 + 5;

int n;
int a[kMaxN], b[kMaxN], c[kMaxN];

void dickdreamer() {
std::cin >> n;
int res = 0;
for (int i = 1; i <= n; ++i) std::cin >> a[i], res ^= a[i];
for (int i = 1; i <= n; ++i) std::cin >> b[i], b[i] ^= a[i];
std::string str;
std::cin >> str;
for (int i = 1; i <= n; ++i) c[i] = str[i - 1] - '0';
for (int c = 60; ~c; --c) {
int x = 0;
for (int i = n; i; --i) {
if (b[i] >> c & 1) {
if (x) {
b[i] ^= x;
} else {
if ((res >> c & 1) != ::c[i]) res ^= b[i];
x = b[i], b[i] = 0;
}
}
}
}
std::cout << res << '\n';
}

int32_t main() {
#ifdef ORZXKR
freopen("in.txt", "r", stdin);
freopen("out.txt", "w", stdout);
#endif
std::ios::sync_with_stdio(0), std::cin.tie(0), std::cout.tie(0);
int T = 1;
std::cin >> T;
while (T--) dickdreamer();
// std::cerr << 1.0 * clock() / CLOCKS_PER_SEC << "s\n";
return 0;
}

CF2115D Gellyfish and Forget-Me-Not 题解
https://sobaliuziao.github.io/2025/07/22/post/23ae683.html
作者
Egg_laying_master
发布于
2025年7月22日
许可协议