求求力,改了7天今天是第八天了,还没改出来
查看原帖
求求力,改了7天今天是第八天了,还没改出来
770640
Elaina_楼主2023/1/7 15:20
#include<bits/stdc++.h>
using namespace std;
const long long F=1000010;
const long long bg=1000000;

struct sl1{
    long long l,r,siz,val,add=3;
}tre[F];

long long tot,n,cnt,m;
long long head[F],ver[F],nxt[F],fa[F],kin[F],mson[F],top[F],nid[F],d[F];
string aim;

void add(long long x,long long y){
    ver[++tot]=y;
    nxt[tot]=head[x];
    head[x]=tot;
}

void spread(long long p){
    if(tre[p].add!=-1){
        long long p1=p*2;
        long long p2=p*2+1;
        tre[p1].val=tre[p].add*tre[p1].siz;
        tre[p2].val=tre[p].add*tre[p2].siz;
        tre[p1].add=tre[p].add;
        tre[p2].add=tre[p].add;
        tre[p].add=-1;
    }
}

void dfs1(long long x,long long f,long long de){
    long long opt=-1;
    d[x]=de;
    fa[x]=f;
    kin[x]=1;
    for(long long i=head[x];i;i=nxt[i]){
        long long y=ver[i];
        if(y==f){
            continue;
        }
        dfs1(y,x,de+1);
        kin[x]+=kin[y];
        if(kin[y]>opt){
            opt=kin[y];
            mson[x]=y;
        }
    }
}

void dfs2(long long x,long long f){
    nid[x]=++cnt;
    top[x]=f;
    if(!mson[x]){
        return;
    }
    dfs2(mson[x],f);
    for(long long i=head[x];i;i=nxt[i]){
        long long y=ver[i];
        if(y==fa[x]||y==mson[x]){
            continue;
        }
        dfs2(y,y);
    }
}

void build(long long p,long long l,long long r){
    tre[p].l=l;
    tre[p].r=r;
    tre[p].siz=r-l+1;
    tre[p].add=-1;   
    long long p1=p*2;
    long long p2=p*2+1;
    long long mid=(l+r)/2;
    if(l==r){
        tre[p].val=0;
        return;
    }
    build(p1,l,mid);
    build(p2,mid+1,r);
    tre[p].val=tre[p1].val+tre[p2].val;
}

void have(long long p,long long l,long long r,long long ml){
    long long p1=p*2;
    long long p2=p*2+1;
    long long mid=(tre[p].l+tre[p].r)/2;
    if(l<=tre[p].l&&tre[p].r<=r){
        tre[p].val=tre[p].siz*ml;
        tre[p].add=ml;
        return;
    }
    spread(p);
    if(l<=mid){
        have(p1,l,r,ml);
    }
    if(r>mid){
        have(p2,l,r,ml);
    }
    tre[p].val=tre[p1].val+tre[p2].val;
    return;
}

long long ask(long long p,long long l,long long r){
    long long ans=0;
    long long p1=p*2;
    long long p2=p*2+1;
    long long mid=(tre[p].l+tre[p].r)/2;
    if(l<=tre[p].l&&tre[p].r<=r){
        return tre[p].val;
    }
    spread(p);
    if(l<=mid){
        ans+=ask(p1,l,r);
    }
    if(r>mid){
        ans+=ask(p2,l,r);
    }
    return ans;
}

long long getask(long long x,long long y){
    long long ans=0;
    if(top[x]!=top[y]){
        if(d[top[x]]<d[top[y]]){
            swap(x,y);
        }
        ans+=ask(1,nid[top[x]],nid[x]);
        x=fa[top[x]];
    }
    if(d[x]>d[y]){
        swap(x,y);
    }
    ans+=ask(1,nid[x],nid[y]);
    return ans;
}

void change(long long x,long long y,long long ml){
    while(top[x]!=top[y]){
        if(d[top[x]]<d[top[y]]){
            swap(x,y);
        }
        have(1,nid[top[x]],nid[x],ml);
        x=fa[top[x]];
    }
    if(d[x]>d[y]){
        swap(x,y);
    }
    have(1,nid[x],nid[y],ml);
}

int main(){
    cin>>n;
    for(long long i=1;i<=n-1;i++){
        long long opt;
        cin>>opt;
        if(opt==0){
            opt=bg;
        }
        add(i,opt);
        add(opt,i);
    }
    dfs1(bg,0,1);
    dfs2(bg,bg);
    build(1,1,n);
    cin>>m;
    while(m--){
        long long len,x1;
        cin>>aim>>x1;
        if(x1==0){
            x1=bg;
        }
        if(aim[0]=='i'){
            cout<<d[x1]-getask(x1,bg)<<endl;
            change(x1,bg,1);
        }
        else{
            cout<<ask(1,nid[x1],nid[x1]+kin[x1]-1)<<endl;
            have(1,nid[x1],nid[x1]+kin[x1]-1,0);
        }
    }
    return 0;
}
2023/1/7 15:20
加载中...