题目:CF1777E。
代码:
#include <bits/stdc++.h>
using namespace std;
#define MAXN 200001
#define MAXK 30
int t, n, ans;
int a[MAXN], mxn[MAXN], s[MAXN], rt1[MAXN], rt2[MAXN];
struct Trie{
struct Node{int s[2], ct;}; vector<Node> tr; Trie(){tr.push_back({{0, 0}, 0});}
void clear(){tr.clear(); tr.shrink_to_fit(); tr.push_back({{0, 0}, 0});}
void ins(int &p, int x, int k, bool debug=0){
if (!p){
int t(tr.size()); p = t; cerr << "f:" << p << ' ' << tr.size() << '\n';
tr.push_back({{0, 0}, 0});
cerr << "g:" << p << ' ' << tr.size() << '\n';
assert(p > 0);
}
++tr[p].ct; if (k >= 0) ins(tr[p].s[x>>k&1], x, k-1, debug);
}
int qry(int p, int q, int x, bool debug=0){
int res(0);
for (int i(MAXK-1); ~i; --i){
bool v(x>>i&1);
if (tr[tr[q].s[!v]].ct > tr[tr[p].s[!v]].ct) p = tr[p].s[!v], q = tr[q].s[!v], res |= 1<<i;
else p = tr[p].s[v], q = tr[q].s[v];
}
return res;
}
}tr1, tr2;
void sol(int l, int r){
if (l == r) return; int mid((l+r)>>1); sol(l, mid); sol(mid+1, r);
s[mid+1] = a[mid+1]; for (int i(mid+2); i<=r; ++i) s[i] = s[i-1]^a[i];
mxn[mid+1] = a[mid+1]; for (int i(mid+2); i<=r; ++i) mxn[i] = max(mxn[i-1], a[i]);
rt1[mid] = rt2[mid] = 0;
for (int i(mid+1); i<=r; ++i){
tr1.ins(rt1[i]=rt1[i-1], s[i], MAXK-1, 1);
// tr2.ins(rt2[i]=rt2[i-1], s[i]^mxn[i], MAXK-1, l == 1 && r == 5);
}
// for (int i(mid), R(mid+1), nw(0), xr(0); i>=l; --i){
// nw = max(nw, a[i]); xr ^= a[i]; while (R <= r && mxn[R] <= nw) ++R;
// if (R > mid+1) ans = max(ans, tr1.qry(rt1[mid], rt1[R-1], xr^nw));
// if (R <= r) ans = max(ans, tr2.qry(rt2[R-1], rt2[r], xr, l == 1 && r == 5 && i == 3));
// }
tr1.clear(); tr2.clear();
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
for (cin >> t; t; --t){
cin >> n; for (int i(1); i<=n; ++i) cin >> a[i]; ans = 0; sol(1, n); cout << ans << '\n';
}
return 0;
}
/*
2
5
1 2 3 4 5
5
1 2 3 4 5
*/
他在:
2
5
1 2 3 4 5
5
1 2 3 4 5
这组数据中会触发 assert。但是你通过我的输出可以发现 p 在赋值之后是 2,但是在一次 tr.push_back 后就变成了 0。为什么?
提示:在 Dev-Cpp 中运行。