树剖+线段树8分求调
查看原帖
树剖+线段树8分求调
922019
xiaoniu142857楼主2025/1/29 18:58
#include <iostream>
#include <cstring>
#define ls(x) ((x)<<1)
#define rs(x) ((x)<<1|1)
using namespace std;
const int N=100001,NINF=0x80808080;
int tree[N<<2],dep[N],siz[N],rt[N],ch[N],dfn[N],top[N],hd[N],to[N<<1],nxt[N<<1],ecnt,vcnt,n;
inline void add(int u,int v){
    to[++ecnt]=v,nxt[ecnt]=hd[u];hd[u]=ecnt;
}
void dfs1(int u){
    dep[u]=dep[rt[u]]+1,siz[u]=1;
    for(int i=hd[u];i;i=nxt[i]){
        int v=to[i];
        if(v==rt[u]) continue;
        rt[v]=u,dfs1(v),siz[u]+=siz[v];
        if(siz[v]>siz[ch[u]]) ch[u]=v;
    }
}
void dfs2(int u,int cur){
    dfn[u]=++vcnt,top[u]=cur;
    if(!ch[u]) return;
    dfs2(ch[u],cur);
    for(int i=hd[u];i;i=nxt[i]){
        int v=to[i];
        if(v==ch[u]||v==rt[u]) continue;
        dfs2(v,v);
    }
}
// void pt(int p,int pl,int pr){
//     printf("node %d : [%d,%d] - %d\n",p,pl,pr,tree[p]);
//     if(pl==pr) return;
//     int mid=pl+pr>>1;
//     pt(ls(p),pl,mid);
//     pt(rs(p),mid+1,pr);
// }
void update(int pos,int p,int pl,int pr){
    if(pl==pr){
        tree[p]=pl;
        return;
    }
    int mid=pl+pr>>1;
    if(pos<=mid) update(pos,ls(p),pl,mid);
    else update(pos,rs(p),mid+1,pr);
    tree[p]=max(tree[ls(p)],tree[rs(p)]);
}
int query(int l,int r,int p,int pl,int pr){
    //cerr<<"query "<<l<<" "<<r<<" "<<p<<" "<<pl<<" "<<pr<<"\n";
    if(l<=pl&&pr<=r){
        return tree[p];
    }
    int mid=pl+pr>>1,res=NINF;
    if(l<=mid) res=max(res,query(l,r,ls(p),pl,mid));
    if(r>mid) res=max(res,query(l,r,rs(p),mid+1,pr));
    return res;
}
inline int queryAns(int u){
    int res;
    while((res=query(dfn[top[u]],dfn[u],1,1,n))==NINF) u=rt[top[u]];
    return res;
}
inline void markNode(int u){
    // printf("mark %d\n",dfn[u]);
    update(dfn[u],1,1,n);
}
int main(){
    ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    int m,u,v;
    string s;
    cin>>n>>m;
    memset(tree,0x80,sizeof(tree));
    for(int i=1;i<n;++i) cin>>u>>v,add(u,v),add(v,u);
    dfs1(1),dfs2(1,1);
    markNode(1);
    // pt(1,1,n);
    // for(int i=1;i<=n;++i){
    //     printf("node %d pre=%d siz=%d dep=%d ch=%d dfn=%d top=%d\n",i,rt[i],siz[i],dep[i],ch[i],dfn[i],top[i]);
    // }
    while(m--){
        cin>>s>>u;
        if(s=="Q") cout<<queryAns(u)<<'\n';
        else markNode(u);
    }
    return 0;
}

只对了#11,其他点都是第十多行才开始出错。哪位神犇能帮蒟蒻调一下啊~~~必关!

2025/1/29 18:58
加载中...