0pts TLE求助
查看原帖
0pts TLE求助
893933
zhaoziyue2022楼主2024/8/3 15:13
#include<bits/stdc++.h>
using namespace std;
struct Edge{
    int to,next;
}edge[2000010];
int head[1000010];
int cnt,n;
int flag[5000010],num[1000010],sum[5000010];
int deep[1000010],siz[1000010],son[1000010],fa[1000100],top[1000010];
void init(){
    for(int i=0;i<2000010;i++){
        edge[i].next=-1;
        head[i]=-1;
    }
    cnt=0;
}
void push(int mid,int s,int t,int p){
    flag[p<<1]=flag[p<<1|1]=flag[p];
    if(flag[p]==0){
        sum[p<<1]=sum[p<<1|1]=0;
    }else{
        sum[p<<1]=mid-s+1;
        sum[p<<1|1]=t-mid;
    }
    flag[p]=-1;
}
int get(int l,int r,int s,int t,int p,int w){
    int ans=sum[p];
    if(l<=s&&t<=r){
        flag[p]=w;
        sum[p]=(t-s+1)*w;
        return ans;
    }
    int mid=s+t>>1;
    if(flag[p]>=0){
        push(mid,s,t,p);
    }
    if(l<=mid){
        ans+=get(l,r,s,mid,p<<1,w);
    }
    if(r>mid){
        ans+=get(l,r,mid+1,t,p<<1|1,w);
    }
    sum[p]=sum[p<<1]+sum[p<<1|1];
    return ans;
}
void addedge(int u,int v){
    edge[cnt].to=v;
    edge[cnt].next=head[u];
    head[u]=cnt++;
}
void dfs(int x,int f){
    //deep[x]=deep[f]+1;
    //fa[x]=f;
    siz[x]=1;
    for(int i=head[x];i;i=edge[i].next){
        int y=edge[i].to;
        if(y!=f){
            fa[y]=x;
            deep[y]=deep[x]+1;
            dfs(y,x);
            siz[x]+=siz[y];
            if(siz[son[x]]<siz[y]){
                son[x]=y;
            }
        }
    }
    
}
void dfs2(int x,int topx){
    top[x]=topx;
    num[x]=++cnt;
    if(son[x]){
        dfs2(son[x],topx);
    }
    for(int i=head[x];i;i=edge[i].next){
        int y=edge[i].to;
        if(y!=fa[x]&&y!=son[x]){
            dfs2(y,y);
        }
    }
}
int LCA(int x,int y){
    int ans=0;
    while(top[x]!=top[y]){
        if(deep[top[x]]<deep[top[y]]){
            swap(x,y);
        }
        ans+=get(num[top[x]],num[x],1,n,1,1);
        x=fa[top[x]];
    }
    if(deep[x]>deep[y]){
        swap(x,y);
    }
    ans+=get(num[x],num[y],1,n,1,1);
    return ans;
}
int main(){
    init();
    int n,x;
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);
    cin>>n;
    memset(flag,-1,sizeof(flag));
    for(int i=1;i<n;i++){
        cin>>x;
        x++;
        fa[i+1]=x;
        addedge(x,i+1);
    }
    deep[1]=1;
    dfs(1,-1);
    dfs2(1,1);
    int q;
    cin>>q;
    string s;
    for(int i=1;i<=q;i++){
        cin>>s>>x;
        x++;
        int ans;
        if(s[0]=='i'){
            ans=LCA(x,i);
            ans=deep[x]-ans;
            
        }else{
            ans=get(num[x],num[x]+siz[x]-1,1,n,1,0);
        }
        cout<<ans<<endl;
    }
    return 0;
}
2024/8/3 15:13
加载中...