30分WA求助~~~
查看原帖
30分WA求助~~~
507534
YBaggio楼主2022/8/22 12:02

代码

#include<bits/stdc++.h>
using namespace std;
const int maxn=200010;
#define int long long
int n,head[maxn],rd[maxn],dep[maxn],cnt,top[maxn],tot,fa[maxn],f[maxn][25],Size[maxn],root;
struct E{
    int to,next;
}edge[maxn<<1];
vector<int>food[maxn];
vector<int>g[maxn];
inline void add(int u,int v){
    edge[++cnt].to=v;edge[cnt].next=head[u];head[u]=cnt;
}
void topo(){
    queue<int>q;
    q.push(0);
    while(!q.empty()){
        int x=q.front();q.pop();
        top[++tot]=x;
        for(int i=head[x];i;i=edge[i].next){
            int y=edge[i].to;rd[y]--;
            if(!rd[y])q.push(y);
        }
    }
    return;
}
int lca(int x,int y){
    if(dep[x]>dep[y])swap(x,y);
    if(dep[y]>dep[x]){
        for(int i=20;i>=0;i--){
            if(dep[y]>=dep[x]&&f[y][i])y=f[y][i];
        }
    }
    if(x==y)return x;
    for(int i=20;i>=0;i--){
        if(f[x][i]!=f[y][i]&&f[x][i]&&f[y][i])x=f[x][i],y=f[y][i];
    }
    return fa[x];
}
void init(int x){
    dep[x]=dep[fa[x]]+1;f[x][0]=fa[x];
    for(int i=1;i<=20;i++)f[x][i]=f[f[x][i-1]][i-1];
    return;
}
void dfs(int x){
    Size[x]=1;
    for(int i=0;i<g[x].size();i++){
        dfs(g[x][i]);
        Size[x]+=Size[g[x][i]];
    }
    return;
}
signed main(){
    memset(fa,-1,sizeof(fa));
    scanf("%lld",&n);
    for(int i=1;i<=n;i++){
        int x;scanf("%lld",&x);
        while(x!=0){
            add(x,i);rd[i]++;
            food[i].push_back(x);
            scanf("%lld",&x);
        }
    }
    for(int i=1;i<=n;i++)if(!rd[i])add(0,i),food[i].push_back(0),rd[i]++;
    topo();
    for(int i=2;i<=tot;i++){
        int x=top[i];
        int LCA=food[x][0];
        for(int j=1;j<food[x].size();j++){
            LCA=lca(LCA,food[x][j]);
        }
        g[LCA].push_back(x);
        fa[x]=LCA;init(x);
    }
    dfs(root);
    for(int i=1;i<=n;i++)printf("%lld\n",Size[i]-1);
    return 0;
}
2022/8/22 12:02
加载中...