1 条题解

  • 0
    @ 2025-8-19 18:05:22
    #include <iostream>
    #include <vector>
    using namespace std;
    #define ll long long
    #define int long long
    #define pb push_back
    constexpr int maxn = 1e5 + 10;
    vector <int> e[maxn];
    ll n, m, k, a[maxn], tot, st[maxn];
    ll idx, dep[maxn], siz[maxn], fa[maxn], rdfn[maxn], top[maxn], wt[maxn], son[maxn];
    void dfs1 (int u, int f) {
    	dep[u] = dep[f] + 1, siz[u] = 1, fa[u] = f;
    	ll maxs = -1;
    	for (int v : e[u]) {
    		if (v == f) continue;
    		dfs1(v, u); siz[u] += siz[v];
    		if (maxs < siz[v]) son[u] = v, maxs = siz[v];
    	}
    }
    void dfs2 (int u, int topid) {
    	rdfn[u] = ++ idx, top[u] = topid, wt[idx] = a[u];
    	if (!son[u]) return;
    	dfs2(son[u], topid);
    	for (int v : e[u]) {
    		if (v == fa[u] || v == son[u]) continue;
    		dfs2(v, v);
    	}
    }
    struct segT {
    	bool wl[2][maxn << 2], wr[2][maxn << 2];
    	void pushup (ll u) {
    		wl[0][u] = wl[wl[0][u << 1]][u << 1 | 1];
    		wl[1][u] = wl[wl[1][u << 1]][u << 1 | 1];
    		wr[0][u] = wr[wr[0][u << 1 | 1]][u << 1];
    		wr[1][u] = wr[wr[1][u << 1 | 1]][u << 1];
    	}
    	void build (int u, int l, int r, ll x) {
    		if (l == r) {
    			wl[0][u] = wr[0][u] = 1, wl[1][u] = wr[1][u] = !((wt[l] >> x) & 1);
    			return;
    		} int mid = l + r >> 1;
    		build(u << 1, l, mid, x), build(u << 1 | 1, mid + 1, r, x);
    		pushup(u);
    	}
    	void update (int u, int l, int r, int pos, int val) {
    		if (l == r) {
    			wl[0][u] = wr[0][u] = 1, wl[1][u] = wr[1][u] = !val;
    			return;
    		} int mid = l + r >> 1;
    		if (pos <= mid) update(u << 1, l, mid, pos, val);
    		else update(u << 1 | 1, mid + 1, r, pos, val);
    		pushup(u);
    	}
    	bool ql (int u, int l, int r, int x, int y, bool c) {
    		if (x <= l && r <= y) return wl[c][u];
    		int mid = l + r >> 1;
    		if (y <= mid) return ql(u << 1, l, mid, x, y, c);
    		else if (x > mid) return ql(u << 1 | 1, mid + 1, r, x, y, c);
    		return ql(u << 1 | 1, mid + 1, r, x, y, ql(u << 1, l, mid, x, y, c));
    	}
    	bool qr (int u, int l, int r, int x, int y, bool c) {
    		if (x <= l && r <= y) return wr[c][u];
    		int mid = l + r >> 1;
    		if (y <= mid) return qr(u << 1, l, mid, x, y, c);
    		else if (x > mid) return qr(u << 1 | 1, mid + 1, r, x, y, c);
    		return qr(u << 1, l, mid, x, y, qr(u << 1 | 1, mid + 1, r, x, y, c));
    	}
    } t[33];
    int solve (int u, int v) {
    	tot = 0; ll ans = 0;
    	while (top[u] != top[v]) {
    		if (dep[top[u]] >= dep[top[v]]) {
    			for (int i = 0; i < k; i ++)
    				ans = ans - (ans & (1ll << i)) + (1ll * t[i].qr(1, 1, n, rdfn[top[u]], rdfn[u], (ans >> i) & 1) << i);
    			u = fa[top[u]];
    		} else {
    			st[++ tot] = v;
    			v = fa[top[v]];
    		}
    	} if (dep[u] < dep[v])
    		for (int i = 0; i < k; i ++) ans = ans - (ans & (1ll << i)) + (1ll * t[i].ql(1, 1, n, rdfn[u], rdfn[v], (ans >> i) & 1) << i);
    	else for (int i = 0; i < k; i ++) ans = ans - (ans & (1ll << i)) + (1ll * t[i].qr(1, 1, n, rdfn[v], rdfn[u], (ans >> i) & 1) << i);
    	for (int i = tot; i >= 1; i --) {
    		int x = st[i];
    		for (int b = 0; b < k; b ++) ans = ans - (ans & (1ll << b)) + (1ll * t[b].ql(1, 1, n, rdfn[top[x]], rdfn[x], (ans >> b) & 1) << b);
    	} return ans;
    }
    signed main () { ios::sync_with_stdio(0), cin.tie(0);
    	cin >> n >> m >> k;
    	for (int i = 1; i <= n; i ++) cin >> a[i];
    	for (int i = 1; i < n; i ++) {
    		int u, v; cin >> u >> v;
    		e[u].pb(v), e[v].pb(u);
    	} dfs1(1, 0), dfs2(1, 1);
    	for (int i = 0; i < k; i ++) t[i].build(1, 1, n, i);
    	while (m --) {
    		string s; ll a, b; cin >> s >> a >> b;
    		if (s == "Replace") {
    			for (int i = 0; i < k; i ++) t[i].update(1, 1, n, rdfn[a], (b >> i) & 1);
    		} else cout << solve(a, b) << '\n';
    	} return 0;
    }
    

    信息

    ID
    1362
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    (无)
    递交数
    1
    已通过
    1
    上传者