萌新刚学LCT,TLE81求助
查看原帖
萌新刚学LCT,TLE81求助
354310
Tnuzy_plzro楼主2023/3/29 14:29

qwq

#include <bits/stdc++.h>
using namespace std;
#define int long long
#define rep(i,a,b) for(int i=a;i<=b;i++)
const int N=1e5+10;
int n,m,sz[N],fa[N],ch[N][2],r[N];
#define ls(x) ch[x][0]
#define rs(x) ch[x][1]
int Fa[N];
int find(int x){
    if(x==Fa[x])return x;
    else{
        return Fa[x]=find(Fa[x]);
    }
}
void pushup(int x){
    sz[x]=sz[ls(x)]+sz[rs(x)]+1;
}
void rev(int x){
    if(!x)return;
    r[x]^=1;
    swap(ls(x),rs(x));
}
void pushdown(int x){
    if(r[x]){
        rev(ls(x));rev(rs(x));
        r[x]=0;
    }
}
int ident(int x){
    return rs(fa[x])==x;
}
int nrt(int x){
    return rs(fa[x])==x||ls(fa[x])==x;
}
void upd(int x){
    if(nrt(x)){
        upd(fa[x]);pushdown(x);
    }else{
        pushdown(x);return;
    }
}
void con(int x,int y,int z){
    fa[x]=y;
    ch[y][z]=x;
}
void rotate(int x){
    int y=fa[x],z=fa[y],id=ident(x),idy=ident(y);
    int c=ch[x][id^1];
    fa[x]=z;
    if(nrt(y))con(x,z,idy);
    con(c,y,id);
    con(y,x,id^1);
    pushup(y);pushup(x);
}
void splay(int x){upd(x);
    while(nrt(x)){
        int y=fa[x];
        if(nrt(y)){
            rotate(ident(x)==ident(y)?y:x);
        }rotate(x);
    }
}
void access(int x){int c=0;
    while(x){splay(x);
        int y=find(fa[x]);rs(x)=c;pushup(x);
        c=x;x=y;
    }
}
void makert(int x){
    access(x);splay(x);rev(x);
}
int findrt(int x){
    access(x);splay(x);
    while(ls(x)){
        pushdown(x);x=ls(x);
    }splay(x);
    return x;
}
void split(int x,int y){
    makert(x);access(y);splay(y);
}
void link(int x,int y){
    makert(x);if(findrt(y)!=x){
        fa[x]=y;
    }
}
void cut(int x,int y){
    makert(x);access(y);
    if(findrt(y)==x&&fa[y]==x&&!ls(y)){
        fa[y]=0;ch[x][1]=0;pushup(x);
    }
}
void comb(int x,int y){
    if(!x)return;
    Fa[find(x)]=y;
    comb(ls(x),y);comb(rs(x),y);
}
map<int,int> mp[N];
void print(int x){
	if(x>>1)print(x>>1);
	if(x&1)cout<<1;else cout<<0;
}
signed main(){
    cin>>n>>m;
    rep(i,1,n)Fa[i]=i,pushup(i);
    rep(i,1,m){
        int u,v;cin>>u>>v;
        if(mp[u][v])continue;
        u=find(u),v=find(v);
        if(findrt(u)!=findrt(v)){
            link(u,v);
        }else{
            split(u,v);
            comb(v,u);
            splay(u);rs(u)=0;pushup(u);
        }
        mp[u][v]++;mp[v][u]++;
    }
    int q;cin>>q;
    while(q--){
        int u,v;cin>>u>>v;
        u=find(u),v=find(v);
        split(u,v);
        print(sz[v]);cout<<'\n';
    }
}
2023/3/29 14:29
加载中...