题意: 分别给定nnn对数字对(Aix,Aiy)(A_i^x,A_i^y)(Aix,Aiy),和mmm 对(Bix,Biy)(B_i^x,B_i^y)(Bix,Biy)。有两个人,第一个人AAA从每对(Aix,Aiy)(A_i^x,A_i^y)(Aix,Aiy)中选一个数字取异或和,即Axor=A0x∣y⊗A1x∣y⊗⋯⊗Anx∣yA_{xor}=A_0^{x|y} \otimes A_1^{x|y} \otimes \dots \otimes A_n^{x|y}Axor=A0x∣y⊗A1x∣y⊗⋯⊗Anx∣y,另一个人BBB从每对(Bix,Biy)(B_i^x,B_i^y)(Bix,Biy)中选取一个数字取异或和,即Bxor=B0x∣y⊗B1x∣y⊗⋯⊗Bmx∣yB_{xor}=B_0^{x|y} \otimes B_1^{x|y} \otimes \dots \otimes B_m^{x|y}Bxor=B0x∣y⊗B1x∣y⊗⋯⊗Bmx∣y,最后得到一个数字ans=Axor⊗Bxorans=A_{xor}\otimes B_{xor}ans=Axor⊗Bxor。AAA希望ansansans尽可能大,BBB希望ansansans尽可能小。双方选择均为最优,ans值应该是多少。
分析: 因为所有的数字对对A,BA,BA,B都是透明的,所以ansansans值是唯一的。
-
首先这个问题并不是一个朴素的线性基问题。我们需要通过某种转换方法之后,使得它能使用线性基解决。首先构造Axor′=A0x⊗A1x⊗⋯⊗AnxA_{xor}^{'}=A_0^x\otimes A_1^x\otimes \dots \otimes A_n^xAxor′=A0x⊗A1x⊗⋯⊗Anx。我们先将假设每次都取了AixA_i^xAix,然后通过判断是否要异或上Ai′=Aix⊗AiyA_i^{'}=A_i^x\otimes A_i^yAi′=Aix⊗Aiy来选择是选择AixA_i^xAix还是AiyA_i^yAiy。如,Axor′⊗Ai′=A0x⊗⋯⊗Aiy⊗⋯⊗AnxA_{xor}^{'}\otimes A_i^{'}=A_0^{x}\otimes \dots \otimes A_i^{y} \otimes \dots \otimes A_n^{x}Axor′⊗Ai′=A0x⊗⋯⊗Aiy⊗⋯⊗Anx。那么我们可以对集合{A0′,A1′,…,An′}\{ A_0^{'},A_1^{'},\dots,A_n^{'}\}{A0′,A1′,…,An′}构造线性基PA={PA0,PA1,…,PA63}\boldsymbol{PA}=\{PA_0,PA_1,\dots,PA_{63}\}PA={PA0,PA1,…,PA63}.其中,PAiPA_iPAi为最高位在iii上的基。同理可以对{B0′,…,Bm′}\{B_0^{'},\dots,B_m^{'}\}{B0′,…,Bm′}构造出线性基PB={PB0,PB1,…,PB63}\boldsymbol{PB}=\{PB_0,PB_1,\dots,PB_{63}\}PB={PB0,PB1,…,PB63}.
-
我们首先得到一个ans′=Axor′⊗Bxor′ans'=A_{xor}^{'}\otimes B_{xor}^{'}ans′=Axor′⊗Bxor′。 接下来要做的是根据PA,PB\boldsymbol{PA,PB}PA,PB来使得ans′ans'ans′满足题目要求。因为线性基的性质,我们从高位开始判断。我们用ans′[i]ans'[i]ans′[i]表示ans′ans'ans′在第iii位上是0,10,10,1。那么对于第iii位来说,存在以下8中情况。用(ans′[i],PAi,PBi)(ans'[i],PA_i,PB_i)(ans′[i],PAi,PBi)来表示。其中,如果PAiPA_iPAi不为0,表示PAiPA_iPAi能够控制当前位置上是000还是111.PBiPB_iPBi同理。
- (0,0,0)(0,0,0)(0,0,0),PAi,PBiPA_i,PB_iPAi,PBi均没有控制能力,跳过。
- (0,0,1)(0,0,1)(0,0,1),PBiPB_iPBi有控制能力,因为BBB希望ans′ans'ans′越小越好,且当前ans′[i]ans'[i]ans′[i]已经是000,所以PBiPB_iPBi不会修改这个位置上的值。
- (0,1,0)(0,1,0)(0,1,0),PAiPA_iPAi有控制能力,因为AAA希望ans′ans'ans′越大越好,且当前ans′[i]ans'[i]ans′[i]是000,所以PAiPA_iPAi会这个位置上的0变成1,即ans′=ans′⊗PAians'=ans'\otimes PA_ians′=ans′⊗PAi。
- (0,1,1)(0,1,1)(0,1,1),均有控制能力,稍后分析。
- (1,0,0)(1,0,0)(1,0,0),PAi,PBiPA_i,PB_iPAi,PBi均没有控制能力,跳过。
- (1,0,1)(1,0,1)(1,0,1),PBiPB_iPBi有控制能力,因为BBB希望ans′ans'ans′越小越好,且当前ans′[i]ans'[i]ans′[i]已经是111,所以PBiPB_iPBi会修改这个位置上的值,即ans′=ans′⊗PBians'=ans'\otimes PB_ians′=ans′⊗PBi。
- (1,1,0)(1,1,0)(1,1,0),PAiPA_iPAi有控制能力,因为AAA希望ans′ans'ans′越大越好,且当前ans′[i]ans'[i]ans′[i]是111,所以PAiPA_iPAi不会修改当前位置。
- (1,1,1)(1,1,1)(1,1,1),均有控制能力,稍后分析。
-
除了4,84,84,8两种情况,其他情况均很显然。重点是如何处理4,84,84,8这两种情况。对于第444种情况,无论我们是否要将PAiPA_iPAi异或到ans′ans'ans′上,PBiPB_iPBi均要采用同样的操作。所以我们可以发现,对于当前这一位我们要么异或上PAi,PBiPA_i,PB_iPAi,PBi,要么两个都不异或。我们发现这个时候PAiPA_iPAi实际上并没有被使用。我们把PAiPA_iPAi从线性基删去。然后构造一个新的变量PABi=PAi⊗PBiPAB_{i}=PA_i\otimes PB_iPABi=PAi⊗PBi,将PABiPAB_{i}PABi插入线性基PA\boldsymbol{PA}PA。这样,如果选取了PABiPAB_{i}PABi,那么说明AAA将PAiPA_iPAi异或上ans′ans'ans′,那么PBiPB_iPBi也要异或上,反之则均不取。
-
第8种情况是4的特例,我们只需要先将ans′=ans′⊗PAians'=ans'\otimes PA_ians′=ans′⊗PAi,那么情况(1,1,1)(1,1,1)(1,1,1)就变成了(0,1,1)(0,1,1)(0,1,1).
#include <cstdio>
#include <iostream>
#include <cstring>
#include <cctype>
#include <string>
#include <string.h>
#include <algorithm>
#include <cmath>
#include <stack>
#include <vector>
#include <map>
#include <fstream>
#include <set>
#include <ctime>
#include <queue>
#include <cstdlib>
#include <fstream>
#define sp system("pause")
#define lc(x) (x<<1)
#define rc(x) (x<<1|1)
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll>pll;
const int MAXN = 1e7;
using namespace std;
ll ans = 0;
int n, m;
ll pa[100], pb[100];
vector<pll>va, vb;
vector<ll>v;
int up = 63;
void getxor(vector<ll> &v, ll p[])
{
for (int i = 0; i <= up; i++)p[i] = 0;
for (auto &i : v)
{
for (int j = up; j >= 0; j--)
{
if ((1LL << j)&i)
{
if (!p[j]) { p[j] = i; break; }
else i ^= p[j];
}
}
}
}
void insertxor(ll i, ll p[])
{
for (int j = up; j >= 0; j--)
{
if ((1LL << j)&i)
{
if (!p[j]) { p[j] = i; break; }
else i ^= p[j];
}
}
}
int main()
{
int T;
cin >> T;
while (T--)
{
ans = 0;
scanf("%d%d", &n, &m);
v.clear();
for (int i = 0; i < n; i++)
{
ll x, y;
scanf("%lld%lld", &x, &y);
ans ^= x;
v.push_back(x^y);
}
getxor(v, pa);
v.clear();
for (int i = 0; i < m; i++)
{
ll x, y;
scanf("%lld%lld", &x, &y);
ans ^= x;
v.push_back(x^y);
}
getxor(v, pb);
for (int i = up; i >= 0; i--)
{
if (pa[i] == 0 && pb[i] == 0)continue;
if (pa[i] == 0 && pb[i] != 0)
{
if ((ans & (1LL << i)))ans ^= pb[i];
}
if (pa[i] != 0 && pb[i] == 0)
{
if (!(ans & (1LL << i)))ans ^= pa[i];
}
if (pa[i] != 0 && pb[i] != 0)
{
if ((ans&(1LL << i)))ans ^= pa[i];
//pa[i] = 0;
insertxor(pa[i] ^ pb[i], pa);
}
}
printf("%lld\n", ans);
}
}
/*
2 3
1 5
4 6
2 3
4 8
6 4
*/
本文深入探讨了一种基于异或运算的策略博弈问题,详细解释了如何通过构造线性基来优化选择,以达到最大化或最小化目标值的目的。文章通过实例展示了如何处理数字对的选择,以及如何利用线性基的特性进行高效计算。
170

被折叠的 条评论
为什么被折叠?



