找父节点和子节点个数(Poj1634)

题目链接:http://poj.org/problem?id=1634

思路:按照工资从小到大排好,找到最近的那个身高较高的人。

有一点要注意的是,这里有个根节点,大boss,他的id是0,因此,我这里的num初始化为1,到时候减去1就是了,但是对于大boss就不一样了,减1就是0咯。

#include <cstdio>
#include <algorithm>
#include <cstring>

using namespace std;

const int maxn = 30005;

struct Staff {
    int id,salary,h;
}staff[maxn];

int n,m;
int ind[1000000];
int num[maxn];
int fa[maxn];

bool cmp(struct Staff a,struct Staff b)
{
    return a.salary<b.salary;
}

int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        memset(fa,0,sizeof(fa));
        for(int i=1;i<maxn;i++)
            num[i] = 1;

        scanf("%d%d",&n,&m);
        for(int i=1;i<=n;i++)
            scanf("%d%d%d",&staff[i].id,&staff[i].salary,&staff[i].h);
        sort(staff+1,staff+n+1,cmp);

        for(int i=1;i<=n;i++)
        {
            ind[staff[i].id]=i;
            for(int j=i+1;j<=n;j++)
            {
                if(staff[j].h>=staff[i].h)
                {
                    fa[i]=j;
                    num[j]+=num[i];
                    break;
                }
            }
        }
        for(int i=1;i<=m;i++)
        {
            int id;
            scanf("%d",&id);
            int u=ind[id];
            printf("%d %d
",staff[fa[u]].id,num[u]-1);
        }
    }
    return 0;
}
原文地址:https://www.cnblogs.com/TreeDream/p/5611762.html