[bzoj1103]大都市meg

[bzoj1103]大都市meg


树剖板子

  • 模板
#include<bits/stdc++.h>
using namespace std;
const int N=2.5e5+2;
int cnt,hed[N],to[N*2],nxt[N*2];
void adde(int u,int v){
    cnt++;to[cnt]=v,nxt[cnt]=hed[u];hed[u]=cnt;
}
int n,m;
/*"----------------------<>----------------------"*/
#define lowbit(x) ((x)&(-x))
int t[N];
inline void add(int pos,int s){
    for(;pos<=n;pos+=lowbit(pos))t[pos]+=s;
}
inline int arrey(int pos){
    int ret=0;
    for(;pos;pos-=lowbit(pos))ret+=t[pos];
    return ret;
}

int qry(int l,int r){
    return arrey(r)-arrey(l);
}
/*"----------------------<>----------------------"*/
int tp[N],dfn[N],fa[N],dep[N],sz[N],hs[N];
inline void dfs(int x,int pre){
    sz[x]=1,fa[x]=pre;int mxsz=0;
    for(int i=hed[x];i;i=nxt[i]){
        int v=to[i];
        if(v==pre)continue;
        dep[v]=dep[x]+1;
        dfs(v,x);
        sz[x]+=sz[v];
        if(mxsz<sz[v]){
            hs[x]=v,mxsz=sz[v];
        }
    }
}
int num=0;
inline void dfs2(int x,int top){
    tp[x]=top;
    dfn[x]=++num;
    add(num,1);
    if(hs[x]) dfs2(hs[x],top);
    for(int i=hed[x];i;i=nxt[i]){
        int v=to[i];
        if(v==fa[x]||v==hs[x])continue;
        dfs2(v,v);
    }
}

inline void Quest(int u){
    int ans=0;
    while(u){
        ans+=qry(dfn[tp[u]]-1,dfn[u]);
        u=fa[tp[u]];
    }
    printf("%d\n",ans-1);
}

char getopt(){
    char x=0;while(x<'A'||x>'Z')x=getchar();
    return x;
}

int main()
{
    scanf("%d",&n);
    for(int i=1;i<n;i++){
        int u,v;
        scanf("%d%d",&u,&v);
        adde(u,v);adde(v,u);
    }
    scanf("%d",&m);
    dfs(1,0);
    dfs2(1,1);
    m=n+m-1;
    while(m--){
        char opt=getopt();int x,y;
        if(opt=='W'){
            scanf("%d",&x);
            Quest(x);
        }else{
            scanf("%d%d",&x,&y);
            if(x<y)swap(x,y);
            add(dfn[x],-1);
        }
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_35923186/article/details/83019072