1 条题解

  • 0
    @ 2025-12-12 8:41:45
    #include<bits/stdc++.h> //20250114
    using namespace std;
    const int N=2e5+10;
    vector<int>G[N];
    int fa[N],dep[N],siz[N],son[N];
    void dfs1(int x,int xfa) 
    {
    	fa[x]=xfa;dep[x]=dep[xfa]+1;siz[x]=1;son[x]=-1;
    	for(int y:G[x])if(y!=xfa)
    	{
    		dfs1(y,x);
    		siz[x]+=siz[y];
    		if(son[x]==-1 || siz[son[x]]<siz[y])son[x]=y;//更新x的重儿子身份
    	}
    }
    
    int tsp,dfn[N],_dfn[N],top[N];
    void dfs2(int x,int tp) 
    { 
        dfn[x]=++tsp;_dfn[tsp]=x;top[x]=tp;//_dfn[x]只在线段树bt用到 
        if(son[x]>0) dfs2(son[x],tp); 
        for(int y:G[x])if(y!=fa[x] && y!=son[x])
        	dfs2(y,y);
    }
    #define lc (p<<1)
    #define rc (p<<1|1)
    #define mid (tr[p].l+tr[p].r)/2
    struct trnode{ int l,r,c, s; }tr[N<<2];
    int a[N];
    void pushup(int p)
    {
        tr[p].c=(tr[lc].c==tr[rc].c)?tr[lc].c:-1;
        tr[p].s=tr[lc].s+tr[rc].s;
    }
    void bt(int p,int l,int r) 
    { 
        tr[p]={l,r,0, 0}; 
        if(l==r) {tr[p].c=a[_dfn[l]];return ;}
        bt(lc,l,mid ); bt(rc,mid+1,r ); 
        pushup(p);
    } 	
    int ans;			   
    void change(int p,int l,int r,int c)
    {
        if(r<tr[p].l || tr[p].r<l) return ;
        if(l<=tr[p].l && tr[p].r<=r) 
        {
            if(c==0)ans+=tr[p].s;
            else ans+= ((tr[p].r-tr[p].l+1)-tr[p].s);
            tr[p].c=c;
            tr[p].s=c*(tr[p].r-tr[p].l+1);
            return ;
        }
        if(tr[p].c>=0)
        {
            tr[lc].c=tr[rc].c=tr[p].c;
            tr[lc].s=tr[lc].c*(tr[lc].r-tr[lc].l+1);
            tr[rc].s=tr[rc].c*(tr[rc].r-tr[rc].l+1);
        }
        change(lc,l,r,c); change(rc,l,r,c);
        pushup(p);
    }
     
    int main()
    {
        int n,m;scanf("%d",&n);
        for(int i=2,x;i<=n;i++)
        {
            scanf("%d", &x);x++;
            G[x].push_back(i);
        }
        dfs1(1,0);
        tsp=0;dfs2(1,1);
        bt(1, 1, tsp);
        scanf("%d",&m);
        while(m--)
        {
            char s[20];int x;
            scanf("%s%d",s,&x);x++;
            if(s[0]=='i')
            {
                ans=0;
                while(x!=0)
                {
                    change(1,dfn[top[x]],dfn[x],1);
                    x=fa[top[x]];
                }
                printf("%d\n",ans);
            }
            else
            {
                ans=0;
                change(1,dfn[x],dfn[x]+siz[x]-1,0);
                printf("%d\n",ans);
            }
        }
        return 0;
    }
    
    • 1

    信息

    ID
    5861
    时间
    1000ms
    内存
    256MiB
    难度
    7
    标签
    递交数
    18
    已通过
    9
    上传者