0%

START199——XOR Game

思路讲解

不难发现,题目中的操作,对题目中总值的影响是

Sum=SumAiAiAj=SumAjSum’=Sum\oplus A_i \oplus A_i \oplus A_j = Sum\oplus A_j

那么如果把两次操作全部选出来。

Sum=SumAj1Aj2Sum‘=Sum\oplus A_{j1} \oplus A_{j2},当然,i1j2i_1≠j_2

i1=j2i_1=j_2,那么就是Sum=SumAj1Ai1Aj1=SumAi1Sum’=Sum\oplus A_{j1} \oplus A_{i1} \oplus A_{j1}=Sum\oplus A_{i1}

那么,这种需要用到01trie树。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// j1,j2
ll ans=0;
FOR(j1,1,N){
ll a=sum^A[j1];
ll mne=tr.argmin_xor(a),mn=tr.min_xor(a);
bool ise=tr.erase(mne);
// 那么 bob 有两种选择,一种是避开我们删除的mne,另一种是就选我们删除的mne
ll lans=min<ll>(tr.min_xor(a),mne^sum);
// 那么删除 mne 可能导致负面影响,那么我们不删除mne的结果是什么那?就是bob选择mne呗
lans=max(lans,mn);
ans=max<ll>(ans,lans);
if(ise) tr.insert(mne);
}
// tr.erase(sum);
// 就是sum^A[i1] 也是一种单独的,虽然上面是又包含,但是是取Max的
ans=min<ll>(ans,tr.max_xor(sum));

AC代码

https://www.codechef.com/viewsolution/1183578991

心路历程(WA,TLE,MLE……)