• p2597 灾难


    我的思路

    代码:

    #include<cstdio>
    #include<iostream>
    #include<algorithm>
    #include<vector>
    #include<queue>
    using namespace std;
    vector<int>death[100010];
    vector<int>hunt[100010];
    vector<int>tree[100010];
    int ans[100010];
    int in[100010];
    int size[100010];
    int st[100010][20];
    int dep[100010];
    int n;
    queue<int>q;
    int read()
    {
        int s=0;
        char in=getchar();
        while(in<'0'||in>'9')
            in=getchar();
        while(in>='0'&&in<='9')
        {
            s=(s<<1)+(s<<3)+in-'0';
            in=getchar();
        }
        return s;
    }
    int lca(int a,int b)
    {
        if(dep[a]<dep[b])
            swap(a,b);
        for(int i=18;i>=0;i--)
        	if(dep[a]-(1<<i)>=dep[b])
            	a=st[a][i];
        if(a==b)
            return a;
        for(int i=18;i>=0;i--)
            if(st[a][i]!=st[b][i])
            {
                a=st[a][i];
                b=st[b][i];
            }
        return st[a][0];
    }
    void solve(int x)
    {
        int t=death[x][0];
        for(int i=1;i<death[x].size();i++)
            t=lca(t,death[x][i]);
        tree[t].push_back(x);
        st[x][0]=t;
        dep[x]=dep[t]+1;
        for(int i=1;i<=18;i++)
            st[x][i]=st[st[x][i-1]][i-1];
    }
    void topsort()
    {
        int pass;
        for(int i=1;i<=n;i++)
            if(!in[i])
            {
                hunt[0].push_back(i);
                death[i].push_back(0);
                in[i]=1;
            }
        q.push(0);
        while(!q.empty())
        {
            pass=q.front();
            q.pop();
            for(int i=0;i<hunt[pass].size();i++)
            {
                in[hunt[pass][i]]-=1;
                if(!in[hunt[pass][i]])
                {
                    solve(hunt[pass][i]);
                    q.push(hunt[pass][i]);
                }
            }
        }
    }
    void dfs(int x)
    {
        ans[x]=1;
        for(int i=0;i<(int)tree[x].size();i++)
        {
            dfs(tree[x][i]);
            ans[x]+=ans[tree[x][i]];
        }
        return ;
    }
    int main()
    {
        n=read();
        int a;
        for(int i=1;i<=n;i++)
        {
            a=read();
            while(a)
            {
                death[i].push_back(a);
                hunt[a].push_back(i);
                in[i]+=1;
                a=read();
            }
        }
        topsort();
        dfs(0);
        for(int i=1;i<=n;i++)
            printf("%d
    ",ans[i]-1);
    }
    
    
  • 相关阅读:
    053573
    053572
    053571
    053570
    053569
    053568
    Android:你好,androidX!再见,android.support
    最新Androidx Fragment的前世今生系列(一)之Fragment的简单使用
    Android开发中如何匹配layout资源(layoutsw480dp layoutsw600dpland layoutsw720dpport)
    Android:Fragment最全面介绍 & 使用方法解析
  • 原文地址:https://www.cnblogs.com/Lance1ot/p/8834758.html
Copyright © 2020-2023  润新知