社区讨论

为什么我的代码TLE on #6了

P3402【模板】可持久化并查集参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@mjxyf6m4
此快照首次捕获于
2026/01/03 15:01
2 个月前
此快照最后确认于
2026/01/06 20:45
2 个月前
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5+1;
int n, m, op, a, b, k, v;
struct Array{
    int val[N<<5], L[N<<5], R[N<<5], root[N*2], idx;
    int build1(int l, int r){
        if (l==r){
            val[++idx] = l;
            return idx;
        }
        int rt = ++idx, mid = l + r >> 1;
        L[rt] = build1(l, mid);
        R[rt] = build1(mid+1, r);
        return rt;
    }
    int build2(int l, int r){
        if (l==r){
            val[++idx] = 1;
            return idx;
        }
        int rt = ++idx, mid = l + r >> 1;
        L[rt] = build2(l, mid);
        R[rt] = build2(mid+1, r);
        return rt;
    }
    int modify(int p, int l, int r, int s, int t){
        if (l==r){
            val[++idx] = t;
            return idx;
        }
        int rt = ++idx, mid = l + r >> 1;
        if (s <= mid){
            L[rt] = modify(L[p], l, mid, s, t);
            R[rt] = R[p];
        } else {
            L[rt] = L[p];
            R[rt] = modify(R[p], mid+1, r, s, t);
        }
        return rt;
    }
    int query(int p, int l, int r, int s){
        if (l==r) return val[p];
        int mid = l + r >> 1;
        if (s <= mid) return query(L[p], l, mid, s);
        return query(R[p], mid+1, r, s);
    }
} fa, rk;
int getfa(int p, int x){
    int f = fa.query(fa.root[p], 1, n, x);
    while(f^x){
        x = f;
        f = fa.query(fa.root[p], 1, n, f);
    }
    return f;
}
int getrk(int p, int x){return rk.query(rk.root[p], 1, n, x);}

int main(){
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    cin>>n>>m;
    fa.root[0] = fa.build1(1, n);
    rk.root[0] = rk.build2(1, n);
    while(m--){
        cin>>op;
        if (op==1){
            cin>>a>>b;
            int s = getfa(v, a), t = getfa(v, b);
            int rs = getrk(v, s), rt = getrk(v, t);
            if (rs > rt) swap(rs, rt), swap(s, t);
            int r1 = fa.modify(fa.root[v], 1, n, s, t);
            if (rs == rt){
                int upd = rk.query(rk.root[v], 1, n, t);
                rk.root[v+1] = rk.modify(rk.root[v], 1, n, t, upd+1);
            } else rk.root[v+1] = rk.root[v];
            fa.root[++v] = r1;
        } else if (op==3){
            cin>>a>>b;
            int s = getfa(v, a), t = getfa(v, b);
            cout << (s==t) << '\n';
            fa.root[v+1] = fa.root[v];
            rk.root[v+1] = rk.root[v];
            ++v;
        } else {
            cin>>k;
            fa.root[++v] = fa.root[k];
            rk.root[v] = rk.root[k];
        }
    }
}

回复

0 条回复,欢迎继续交流。

正在加载回复...