1 条题解

  • 1
    @ 2022-8-17 22:23:35
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    const int maxn=200005;
    int n,k=0,x,head[maxn],q,deep[maxn],father[maxn],size[maxn];
    int tid[maxn],top[maxn],son[maxn],tidnum=0,pos[maxn];char s[15];
    struct node
    {
        int to,next;
    } edge[maxn<<1];
    struct Node
    {
        int left,right,flag,sum;
    } tree[maxn<<2];
    void add(int u,int v)
    {
        edge[++k].to=v;
        edge[k].next=head[u];
        head[u]=k;
    }
    int read()
    {
        int x=0;char ch=getchar();
        while(ch<48||ch>57) ch=getchar();
        while(ch>=48&&ch<=57) x=x*10+ch-48,ch=getchar();
        return x;
    }
    void dfs1(int x,int fa,int depth)
    {
        size[x]=1;father[x]=fa;deep[x]=depth;
        for(int i=head[x];i;i=edge[i].next)
        {
            if(edge[i].to==fa) continue;
            dfs1(edge[i].to,x,depth+1);
            size[x]+=size[edge[i].to];
            if(!son[x]||size[edge[i].to]>size[son[x]]) son[x]=edge[i].to;
        }
    }
    void dfs2(int x,int tp)
    {
        tid[x]=++tidnum;pos[tid[x]]=x;top[x]=tp;
        if(!son[x]) return;dfs2(son[x],tp);
        for(int i=head[x];i;i=edge[i].next)
        {
            if(edge[i].to!=son[x]&&edge[i].to!=father[x])
                dfs2(edge[i].to,edge[i].to);
        }
    }
    void build(int id,int l,int r)
    {
        tree[id].left=l;tree[id].right=r;
        tree[id].sum=0;tree[id].flag=-1;
        if(l==r) return;
        int mid=(l+r)>>1;
        build(id<<1,l,mid);build(id<<1|1,mid+1,r);
        return;
    }
    void downdata(int id)
    {
        tree[id<<1].sum=(tree[id<<1].right-tree[id<<1].left+1)*tree[id].flag;
        tree[id<<1|1].sum=(tree[id<<1|1].right-tree[id<<1|1].left+1)*tree[id].flag;
        tree[id<<1].flag=tree[id<<1|1].flag=tree[id].flag;
        tree[id].flag=-1;
    }
    int get(int id,int l,int r)
    {
        if(tree[id].right<l||tree[id].left>r) return 0;
        if(tree[id].right<=r&&tree[id].left>=l) return tree[id].sum;
        if(tree[id].flag!=-1) downdata(id);
        return get(id<<1,l,r)+get(id<<1|1,l,r);
    }
    void update(int id,int l,int r,int val)
    {
        if(tree[id].right<l||tree[id].left>r) return;
        if(tree[id].right<=r&&tree[id].left>=l)
        {
            tree[id].sum=(tree[id].right-tree[id].left+1)*val;
            tree[id].flag=val;
            return;
        }
        if(tree[id].flag!=-1) downdata(id);
        update(id<<1,l,r,val);update(id<<1|1,l,r,val);
        tree[id].sum=tree[id<<1].sum+tree[id<<1|1].sum;
        return;
    }
    void change(int u,int v,int val)
    {
        while(top[u]!=top[v])
        {
            if(deep[top[u]]<deep[top[v]]) std::swap(u,v);
            update(1,tid[top[u]],tid[u],val);
            u=father[top[u]];
        }
        if(deep[u]>deep[v]) std::swap(u,v);
        update(1,tid[u],tid[v],val);
        return;
    }
    int main()
    {
        n=read();
        for(int i=2;i<=n;i++)
        {
            x=read();x++;
            add(x,i);
        }
        dfs1(1,1,1);dfs2(1,1);
        q=read();build(1,1,tidnum);
        for(int i=1;i<=q;i++)
        {
            scanf("%s",s);
            x=read();x++;
            int t1=tree[1].sum;
            if(s[0]=='i')
            {
                change(1,x,1);
                int t2=tree[1].sum;
                printf("%d\n",abs(t2-t1));
                
            }
            if(s[0]=='u')
            {
                update(1,tid[x],tid[x]+size[x]-1,0);
                int t2=tree[1].sum;
                printf("%d\n",abs(t1-t2));
            }
        }
        return 0;
    }
    
    
    • 1

    信息

    ID
    148
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    6
    已通过
    3
    上传者