萌新求助WA 0!
查看原帖
萌新求助WA 0!
354310
Tnuzy_plzro楼主2022/12/26 22:02

rt,调2h了,求救!qwq

#include <bits/stdc++.h>
using namespace std;
#define rep(i, a, b) for (int i = a; i <= b; i++)
const int N=2e5+10;
int fa[N<<1],n,m,q;
int find(int x){
    return x==fa[x]?x:(fa[x]=find(fa[x]));
}
int f[N<<1][24],ls[N<<1],rs[N<<1];
int l[N<<1],r[N<<1];
int val[N<<1];
void con(int x,int y,int k){
    x=find(x),y=find(y);
    f[x][0]=f[y][0]=k;
    fa[x]=k;fa[y]=k;fa[k]=k;
    ls[k]=x;rs[k]=y;
}
void init(){
    for(int k=23;k;k--){
        rep(i,1,n<<1){
            f[i][k]=f[f[i][k-1]][k-1];
        }
    }
}
int tot=0;//n
int xxs=0;
int xl[N<<1];
int bxl[N<<1];
int ys[N<<1],tp[N<<1];
void dfs(int x){//1-n find dfs
    if(!ls[x]&&!rs[x]){
        l[x]=r[x]=++xxs;
        xl[xxs]=x;
        return;
    }
    dfs(ls[x]),dfs(rs[x]);
    l[x]=l[ls[x]];
    r[x]=r[rs[x]];
}

void cls(){
    rep(i,0,n<<1)fa[i]=i,ls[i]=rs[i]=l[i]=r[i]=val[i]=xl[i]=tot=xxs=0;
    rep(k,0,23)rep(i,1,n<<1)f[i][k]=0;
}
struct edge{
    int u,v;
};
edge E[N];
struct quiz{
    int s,e,l,r;
    int l1,r1,l2,r2;
    int id,ans;
};
quiz Q[N];
struct hjt{
    int ls[N<<5],rs[N<<5],sz[N<<5],rt[N<<1];
    int tott=0;
    void pushup(int x){
        sz[x]=sz[ls[x]]+sz[rs[x]];
    }
    void ins(int &x,int h,int p,int l,int r){
        int mid=l+r>>1;
        x=++tott;
        ls[x]=ls[h];
        rs[x]=rs[h];
        sz[x]=sz[h];
        if(l==r){
            sz[x]++;
            return;
        }
        if(p<=mid)ins(ls[x],ls[h],p,l,mid);
        if(p>mid)ins(rs[x],rs[h],p,mid+1,r);
        pushup(x);
    }
    int sum(int x,int L,int R,int l,int r){
        int mid=l+r>>1;
        if(L<=l&&r<=R){
            return sz[x];
        }
        int ret=0;
        if(L<=mid){
            ret+=sum(ls[x],L,R,l,mid);
        }
        if(R>mid){
            ret+=sum(rs[x],L,R,mid+1,r);
        }return ret;
    }
};
hjt tree;
signed main(){
    //ios::sync_with_stdio(0);
    cin>>n>>m>>q;
    rep(i,1,m){
        int u,v;
        cin>>u>>v;
        E[i]={u+1,v+1};
    }
    rep(i,1,q){
        cin>>Q[i].s>>Q[i].e>>Q[i].l>>Q[i].r;
        Q[i].s++;Q[i].e++;Q[i].l++;Q[i].r++;
    }
    //
    cls();
    rep(i,1,n)val[i]=i;
    sort(E+1,E+m+1,[](edge a,edge b){
        return max(a.u,a.v)<max(b.u,b.v);
    });
    tot=n;
    rep(i,1,m){
        if(find(E[i].u)==find(E[i].v))continue;
        con(E[i].u,E[i].v,++tot);
        val[tot]=max(E[i].u,E[i].v);
    }
    init();
    dfs(tot);
    rep(i,1,q){
        int s=Q[i].e;
        int xd=Q[i].r;
        for(int k=23;k>=0;k--){
            int w=f[s][k];
            if(!w)continue;
            if(val[w]<=xd)s=w;
        }
        Q[i].l2=l[s];
        Q[i].r2=r[s];
    }
    //
    rep(i,1,n<<1)bxl[i]=xl[i];
    //
    cls();
    rep(i,1,n)val[i]=i;
    sort(E+1,E+m+1,[](edge a,edge b){
        return min(a.u,a.v)>min(b.u,b.v);
    });
    tot=n;
    rep(i,1,m){
        if(find(E[i].u)==find(E[i].v))continue;
        con(E[i].u,E[i].v,++tot);
        val[tot]=min(E[i].u,E[i].v);
    }
    init();
    dfs(tot);
    rep(i,1,q){
        int s=Q[i].s;
        int xd=Q[i].l;
        for(int k=23;k>=0;k--){
            int w=f[s][k];
            if(!w)continue;
            if(val[w]>=xd)s=w;
        }
        Q[i].l1=l[s];
        Q[i].r1=r[s];
    }
    rep(i,1,q)Q[i].id=i;
    rep(i,1,n){
        tp[xl[i]]=i;
    }
    rep(i,1,n){
        ys[i]=tp[bxl[i]];
        tree.ins(tree.rt[i],tree.rt[i-1],ys[i],1,n);
    }
    rep(i,1,q){
        auto w=tree.sum(tree.rt[Q[i].r2],Q[i].l1,Q[i].r1,1,n)-tree.sum(tree.rt[Q[i].l2-1],Q[i].l1,Q[i].r1,1,n);
        if(w)puts("1");
        else puts("0");
    }
}
2022/12/26 22:02
加载中...