萌新求调树剖板子杨立国了但是 wa0
查看原帖
萌新求调树剖板子杨立国了但是 wa0
1013955
1234567890sjx楼主2024/8/24 12:24
#
/*
#define THIS_IS_JIAOHUTI
*/
#


#include<bits/stdc++.h>
#define pb push_back
#define eb emplace_back
#ifndef THIS_IS_JIAOHUTI
#define int long long
#endif
#define F(i,x,y) for(int i=x;i<=y;++i)
#define G(i,x,y) for(int i=x;i>=y;--i)
#define FD(x,y) for(int i=x;i*i<=y;++i)
#define GD(x,y) for(int i=x;i*i>=y;--i)
#define adde(x,y) z[x].eb(y);
#define Adde(x,y) z[x].eb(y),z[y].eb(x);
#define addew(x,y,w) z[x].eb(y,w)
#define Addew(x,y,w) z[x].eb(y,w),z[y].eb(x,w)
#define FIMX(X) memset(X,0x3f,sizeof X)
#define FIMI(X) memset(X,-0x3f,sizeof X)
#define FI0(X) memset(X,0,sizeof X)
#define FIN(X) memset(X,-1,sizeof X)
#define rng(X) X.begin(),X.end()
#define PII pair<int,int>
#define PDD pair<double,double>
#define PIII tuple<int,int,int>
#define VI vector<int>
#define VII vector<PII>
#define VID vector<pair<int,double>>
#define VDD vector<PDD>
using namespace std;
const int N=600100;
int n,m,s;
VI z[N];
int sz[N],dep[N],hev[N],top[N],up[N],dfn[N],back[N],a[N],xia[N];
void dfs(int u,int fa){
    sz[u]=1,dep[u]=dep[fa]+1,up[u]=fa;
    for(auto &v:z[u])if(v!=fa){
        dfs(v,u),sz[u]+=sz[v];
        xia[u]=v;
        if(sz[hev[u]]<sz[v])hev[u]=v;
    }
}
int idx;
void dfs2(int u,int Top,int fa){
    top[u]=Top;
    dfn[u]=++idx,back[idx]=u;
    if(hev[u])dfs2(hev[u],Top,u);
    for(auto &v:z[u])if(v!=fa&&v!=hev[u])
        dfs2(v,v,u);
}
int lca(int u,int v){
    while(top[u]!=top[v]){
        if(dep[top[u]]>dep[top[v]])
            u=up[top[u]];
        else
            v=up[top[v]];
    }
    if(dep[u]<dep[v])
        return u;
    return v;
}
namespace yhb{

struct qwq{
    int l,r,sum,tag;
    void init(int p){
        l=r=p;sum=1,tag=0;
    }
    void yhb(int x){
        sum=(r-l+1)*x,tag=x;
    }
}z[N<<2];
qwq operator+(const qwq&l,const qwq&r){ //pushup
    return {l.l,r.r,l.sum+r.sum,0ll};
}
void build(int l,int r,int rt){
    if(l==r)return z[rt].init(l);
    int mid=l+r>>1;
    build(l,mid,rt<<1);
    build(mid+1,r,rt<<1|1);
    z[rt]=z[rt<<1]+z[rt<<1|1];
}
void pushyhb(int rt){
    if(z[rt].tag){
        z[rt<<1].yhb(z[rt].tag);
        z[rt<<1|1].yhb(z[rt].tag);
        z[rt].tag=0;
    }
}
void modify(int l,int r,int rt,int ll,int rr,int v){
    if(l==r){z[rt].sum=v;return;}
    int mid=l+r>>1;pushyhb(rt);
    if(ll<=mid)modify(l,mid,rt<<1,ll,rr,v);
    if(mid<rr)modify(mid+1,r,rt<<1|1,ll,rr,v);
    z[rt]=z[rt<<1]+z[rt<<1|1];
}
int query(int l,int r,int rt,int ll,int rr){
    if(ll<=l&&r<=rr)return z[rt].sum;
    if(ll>rr)return 0;
    int mid=l+r>>1,s=0;pushyhb(rt);
    if(ll<=mid&&mid<rr)return query(l,mid,rt<<1,ll,rr)+query(mid+1,r,rt<<1|1,ll,rr);
    if(mid<rr)return query(mid+1,r,rt<<1|1,ll,rr);
    return query(l,mid,rt<<1,ll,rr);
}
}

void lnk_modify(int u,int v,int w){
    while(top[u]!=top[v]){
        if(dep[up[top[u]]]<dep[up[top[v]]])
            swap(u,v);
        yhb::modify(1,n,1,dfn[top[u]],dfn[u],w);
        u=up[top[u]];
    }
    if(dep[u]>dep[v])swap(u,v);
    yhb::modify(1,n,1,dfn[u]+1,dfn[v],w);
}
int lnk_query(int u,int v){
    int s=0;
    while(top[u]!=top[v]){
        if(dep[up[top[u]]]<dep[up[top[v]]])
            swap(u,v);
        s+=yhb::query(1,n,1,dfn[top[u]],dfn[u]);
        u=up[top[u]];
    }
    if(dep[u]>dep[v])swap(u,v);
    s+=yhb::query(1,n,1,dfn[u]+1,dfn[v]);
    return s;
    // cout<<"Err "<<dfn[u]<<' '<<dfn[v]<<' '<<yhb::query(1,n,1,dfn[u],dfn[u])<<' '<<yhb::query(1,n,1,dfn[u]+1,dfn[v])<<' '<<yhb::query(1,n,1,dfn[u],dfn[v])<<'\n';
}

namespace __{

int fa[N];
int find(int x){
    return x==fa[x]?x:fa[x]=find(fa[x]);
} bool Union(int x,int y){
    if(find(x)!=find(y)){
        fa[find(x)]=find(y);
        return 1;
    }
    return 0;
}
} using namespace __; // namespace __

PII ed[N];
struct Query{
    int o,x,y;
}Q[N];

#ifndef THIS_IS_JIAOHUTI
signed main(){
    cin>>n>>m;
    set<PII>rem;
    F(i,1,m){
        int u,v;cin>>u>>v;
        ed[i]={u,v};
        rem.insert({u,v});
    }
    F(i,1,n)fa[i]=i;
    int q=0,o;
    while(cin>>o,~o){
        int x,y;cin>>x>>y;
        Q[++q]={o,x,y};
        if(o==0)rem.erase({x,y});
    }
    for(auto &[x,y]:rem){
        if(!Union(x,y)){
            lnk_modify(x,y,0);
        }
        else{
            // cout<<"Edge "<<x<<' '<<y<<'\n';
            Adde(x,y);
        }
    }
    VI res;
    dfs(1,0),dfs2(1,1,0);
    yhb::build(1,n,1);
    // yhb::modify(1,n,1,1,1,0);
    F(i,1,n)fa[i]=i;
    F(i,1,n)for(auto &j:z[i])
        Union(i,j);
    G(i,q,1){
        auto [o,u,v]=Q[i];
        if(o==1)
            res.emplace_back(lnk_query(u,v));
        else{
            // cout<<"Init\n";
            if(!Union(u,v)){
                // cout<<"qwq "<<u<<' '<<v<<" In\n";
                lnk_modify(u,v,0);
            }
        }
    }
    reverse(rng(res));
    for(auto &x:res)
        cout<<x<<'\n';
}

#else

#define NO_MAIN
void no_main() {
    puts("pwp");
}

#endif
2024/8/24 12:24
加载中...