莫名re,玄关
查看原帖
莫名re,玄关
760908
magic_dream楼主2024/7/9 22:34

找到了re出现的位置(也可能是其他地方出现的问题),但是不懂为什么会出现这样的情况,在下面代码中进行了说明,请大佬解释一下原因。


#include<bits/stdc++.h>
#define int long long
#define debug(x) cout<<"LINE"<<__LINE__<<":"<<#x<<"="<<x<<endl;
using namespace std;
typedef long long ll;

struct Trie_01{
    int re = 0;
    int cnt = 0;
    int maxx = 0;
    vector<vector<int>> ch;
    vector<int> w;
    vector<int> xorv;
    Trie_01() {};
    
    Trie_01(int n) {
        ini(n);
    };

    void ini(int n) {
        cnt = 0;
        maxx = 25;
        ch.resize(2);
        for(int i = 0; i < 2; ++i) {
            ch[i].resize((n + 1) * maxx);
        }
        re = (n + 1) * maxx;
        w.resize((n + 1) * maxx);
        xorv.resize((n + 1) * maxx);
    }

    void maintain(int inx) {
        w[inx] = xorv[inx] = 0;
        if(ch[0][inx]) {
            w[inx] += w[ch[0][inx]];
            xorv[inx] ^= (xorv[ch[0][inx]] << 1);
        }
        if(ch[1][inx]) {
            w[inx] += w[ch[1][inx]];
            xorv[inx] ^= (xorv[ch[1][inx]] << 1 | (w[ch[1][inx]] & 1));
        }
    }

    void ins(int &inx, int x, int dep) {
        if(!inx) inx = ++cnt; //问题应该是出在这里,cnt加到超过了maxx * (n + 1)的值。
      //我对于每一个数设置的深度为20,超过就return了,
      //但在上面resize的时候每一个数分配了25的大小,空间应该是足够的
      //不清楚为什么会超过maxx*(n + 1)的大小。
        if(dep > 20) {
            w[inx]++;
            return ;
        }
        ins(ch[x & 1][inx], x >> 1, dep + 1);
        maintain(inx);
    }
    void add(int inx) {
        if(ch[1][inx]) {
            add(ch[1][inx]);
        }
        swap(ch[1][inx], ch[0][inx]);
        maintain(inx);
    }
};

void solve() {
	int n, m;
    cin >> n >> m;
    vector<int> val(n + 1);
    vector<vector<int>> e(n + 1);
    for(int i = 1; i <= n - 1; ++i) {
        int u, v;
        cin >> u >> v;
        e[u].push_back(v);
        e[v].push_back(u);
    }
	for(int i = 1; i <= n; ++i) {
        cin >> val[i];
    }
    vector<int> fa(n + 1);
    auto dfs = [&](auto self, int u, int f) -> void {
        fa[u] = f;
        for(auto v : e[u]) {
            if(v != f) {
                self(self, v, u);
            }
        }
    };
    dfs(dfs, 1, -1);
    Trie_01 t = Trie_01(n);
    vector<int> rt(n + 1);
    vector<int> st(n + 1);
    for(int i = 1; i <= n; ++i) {
        if(fa[i] != -1) {
            t.ins(rt[fa[i]], val[i], 0);
        }
    }
    auto cal = [&](int inx) -> int { 
        return (fa[inx] == -1 ? 0 : st[fa[inx]]) + val[inx]; 
    };
	for(int i = 1; i <= m; ++i) {
        int type, inx, v;
        cin >> type >> inx;
        if(type == 1) {
            t.add(rt[inx]);
            st[inx]++;
            if(inx != 1) {
                if(fa[fa[inx]] != -1) t.ins(rt[fa[fa[inx]]], cal(fa[inx]), 0);
                val[fa[inx]]++;
                if(fa[fa[inx]] != -1) t.ins(rt[fa[fa[inx]]], cal(fa[inx]), 0);
            }
        } else if(type == 2) {
            cin >> v;
            if(inx != 1) t.ins(rt[fa[inx]], cal(inx), 0);
            val[inx] -= v;
            if(inx != 1) t.ins(rt[fa[inx]], cal(inx), 0);
        } else {
            int ans = t.xorv[rt[inx]];
            if(fa[inx] != -1) {
                ans ^= cal(fa[inx]);
            }
            cout << ans << '\n';
        }
    }
	
}

signed main(){
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	cout.tie(nullptr);
	
	int cn = 1;
	// cin >> cn;
	
	while(cn--)
		solve();
	
	return 0;
}
2024/7/9 22:34
加载中...