啊哈啊啊哈哈ODT求条
  • 板块CF343D Water Tree
  • 楼主Alea
  • 当前回复2
  • 已保存回复2
  • 发布时间2023/11/8 14:35
  • 上次更新2023/11/8 17:17:14
查看原帖
啊哈啊啊哈哈ODT求条
322792
Alea楼主2023/11/8 14:35
#include <bits/stdc++.h>
using namespace std;
const int SIZE=5e5+10;
int n,m;
vector<int> G[SIZE];
int siz[SIZE],fh[SIZE],dep[SIZE];
int wson[SIZE],toch[SIZE],dfn[SIZE],nfd[SIZE],dft;
void dfs(int u,int fa){
    siz[u]=1,fh[u]=fa,dep[u]=dep[fa]+1;
    for(int v:G[u]){
        if(v==fa) continue;
        dfs(v,u);
        siz[u]+=siz[v];
        if(siz[wson[u]]<siz[v]) wson[u]=v;
    }
}
void subd(int u,int top){
    toch[u]=top,dfn[u]=++dft,nfd[dft]=u;
    if(wson[u]==0) return;
    subd(wson[u],top);
    for(int v:G[u]){
        if(v==fh[u]||v==wson[u]) continue;
        subd(v,v);
    }
}
struct noodt{
    int l,r;
    mutable int val;
    noodt(int l,int r=-1,int val=0):l(l),r(r),val(val){}
    bool operator<(const noodt &rhs)const{
        return l<rhs.l;
    }
};
set<noodt> odt;
typedef set<noodt>::iterator iter;
iter split(int pos){
    iter it=odt.lower_bound(noodt(pos));
    if(it!=odt.end()&&it->l==pos) return it;
    --it;
    int l=it->l,r=it->r,val=it->val;
    odt.erase(it);
    odt.insert(noodt(l,pos-1,val));
    return odt.insert(noodt(pos,r,val)).first;
}
void assign(int lf,int rt,int val){
    iter itr=split(rt+1),itl=split(lf);
    odt.erase(itl,itr);
    odt.insert(noodt(lf,rt,val));
}
int query(int pos){
    iter itat=split(pos);
    return itat->val;
}
int main(){
    cin>>n;
    for(int i=1;i<n;i++){
        int u,v;
        cin>>u>>v;
        G[u].push_back(v);
        G[v].push_back(u);
    }
    dfs(1,1);
    subd(1,1);
    odt.insert(noodt(0,n+1,0));
    cin>>m;
    while(m--){
        int o,u;
        cin>>o>>u;
        if(o==1) assign(dfn[u],dfn[u]+siz[u]-1,1);
        if(o==2) do assign(dfn[toch[u]],dfn[u],0),u=fh[toch[u]]; while(u!=1);
        if(o==3) cout<<query(dfn[u])<<endl;
    }
    return 0;
}
2023/11/8 14:35
加载中...