求助可能的 UB?
  • 板块学术版
  • 楼主rainygame
  • 当前回复14
  • 已保存回复14
  • 发布时间2024/10/8 18:02
  • 上次更新2024/10/8 20:42:51
查看原帖
求助可能的 UB?
804607
rainygame楼主2024/10/8 18:02

题目: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 中运行。

2024/10/8 18:02
加载中...