按秩合并 TLE 96 求助
查看原帖
按秩合并 TLE 96 求助
476985
Accelessar楼主2023/12/1 15:37

rt, TLE on #14

#include<bits/stdc++.h>
using namespace std;
#define fr(i,l,r) for(int i(l);i<=r;i++)
template<typename T>inline T rd(T&a){
    #define gc getchar
    #define dg(x) (x>='0'&&x<='9')
    char c=gc();T x=0,f=1;
    for(;!dg(c);c=gc())if(c=='-')f=-1;
    for(;dg(c);c=gc())x=(x<<1)+(x<<3)+c-48;
    return a=f*x;
}template<typename T,typename...V>inline void rd(T&x,V&...v){rd(x),rd(v...);}
const int N=2e5+3;
int n,m,op,x,y;

struct persistent_arr {
#define mid ((l+r)>>1)
    int tot,rt[N],ls[N<<7],rs[N<<7],val[N<<7];
    void build(int&p,int l,int r,int v){
        p=++tot;
        if(l==r)return val[p]=~v?v:l,void();
        build(ls[p],l,mid,v),build(rs[p],mid+1,r,v);
    }
    void modify(int o,int&p,int l,int r,int k,int x){
        p=++tot,ls[p]=ls[o],rs[p]=rs[o],val[p]=val[o];
        if(l==r)return val[p]=x,void();
        k>mid?modify(rs[o],rs[p],mid+1,r,k,x):modify(ls[o],ls[p],l,mid,k,x);
    }void sett(int ver,int k,int x){modify(rt[ver-1],rt[ver],1,n,k,x);}
    int ask(int p,int l,int r,int k){
        if(l==r)return val[p];
        return k>mid?ask(rs[p],mid+1,r,k):ask(ls[p],l,mid,k);
    }int at(int ver,int k){return ask(rt[ver],1,n,k);}
}fa,dep;

struct persistent_dsu {
    inline int find(int ver,int x){
        int f=fa.at(ver,x);
        return x==f?x:find(ver,f);
    }
    void merge(int ver,int x,int y){
        int fx=find(ver,x),fy=find(ver,y);
        if(fx==fy)return;
        int dx=dep.at(ver,x),dy=dep.at(ver,y);
        if(dx>dy)swap(x,y),swap(fx,fy),swap(dx,dy);
        fa.sett(ver,fx,fy);
        if(dx==dy)dep.sett(ver,fy,dy+1);
    }
}dsu;

int main(){
    // freopen("P3402_14.in","r",stdin);
    // freopen("P3402_14.ans","w",stdout);
    rd(n,m);fa.build(fa.rt[0],1,n,-1),dep.build(dep.rt[0],1,n,1);
    fr(i,1,m){
        rd(op,x),fa.rt[i]=fa.rt[i-1],dep.rt[i]=dep.rt[i-1];
        if(op==1)dsu.merge(i,x,rd(y));
        else if(op&1)cout<<(dsu.find(i,x)==dsu.find(i,rd(y)))<<'\n';
        else fa.rt[i]=fa.rt[x],dep.rt[i]=dep.rt[x];
    }return 0;
}
2023/12/1 15:37
加载中...