线段树求条
  • 板块CF343D Water Tree
  • 楼主Alea
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/11/8 08:21
  • 上次更新2023/11/8 14:34:56
查看原帖
线段树求条
322792
Alea楼主2023/11/8 08:21

样例都过不去

#include <bits/stdc++.h>
using namespace std;
const int SIZE=5e5+10;
int n,m;
// these three lines contains a tree
vector<int> G[SIZE];
int siz[SIZE],fh[SIZE],dep[SIZE];
int wson[SIZE],toch[SIZE],dfn[SIZE],nfd[SIZE],dft;
// this line contains a segment tree
int wtf[SIZE],omg[SIZE];
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);
    }
}
void build(int co,int lf,int rt){
    wtf[co]=0,omg[co]=-1;
    if(lf==rt) return wtf[co]=0,void();
    int mi=lf+(rt-lf)/2;
    build(co*2,lf,mi);
    build(co*2+1,mi+1,rt);
}
void pushdown(int co){
    if(omg[co]==-1) return;
    wtf[co*2]=wtf[co*2+1]=omg[co];
    omg[co*2]=wtf[co*2+1]=omg[co];
    omg[co]=-1;
}
void modify(int co,int lf,int rt,int ml,int mr,int mv){
    // cout<<"modify "<<co<<" "<<lf<<" "<<rt<<" "<<ml<<" "<<mr<<" "<<mv<<endl;
    if(ml<=lf&&rt<=mr) return wtf[co]=mv,omg[co]=mv,void();
    int mi=lf+(rt-lf)/2;
    pushdown(co);
    if(ml<=mi) modify(co*2,lf,mi,ml,mr,mv);
    if(mi<mr) modify(co*2+1,mi+1,rt,ml,mr,mv);
}
int query(int co,int lf,int rt,int qx){
    // cout<<"query "<<co<<" "<<lf<<" "<<rt<<" "<<qx<<endl;
    if(lf==rt) return wtf[co];
    pushdown(co);
    int mi=lf+(rt-lf)/2,qans=0;
    if(qx<=mi) qans=query(co*2,lf,mi,qx);
    else qans=query(co*2+1,mi+1,rt,qx);
    return qans;
}
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),build(1,1,n);
    cin>>m;
    while(m--){
        int o,u;
        cin>>o>>u;
        if(o==1) modify(1,1,n,dfn[u],dfn[u]+siz[u]-1,1);
        if(o==2) do modify(1,1,n,dfn[toch[u]],dfn[u],0),u=fh[toch[u]]; while(u!=1);
        if(o==3) cout<<query(1,1,n,dfn[u])<<endl;
    }
    return 0;
}
2023/11/8 08:21
加载中...