ZOJ 2866 Overstaffed Company

树状数组

#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<vector>
using namespace std;

const int maxn = 1000000 + 10;
vector<int>Tree[50000 + 10];
int n;
int val[50000 + 10];
int c[maxn];
int ans[50000 + 10];

int lowbit(int x)
{
    return x & (-x);
}

void Update(int x, int add)
{
    while (x < maxn)
    {
        c[x] += add;
        x += lowbit(x);
    }
}

int Get(int x)
{
    int ret = 0;
    while (x != 0)
    {
        ret += c[x];
        x -= lowbit(x);
    }
    return ret;
}

void init()
{
    for (int i = 0; i <= n; i++) Tree[i].clear();
    memset(c, 0, sizeof c);
}

void DFS(int now)
{
    int A, B;
    A = Get(1000000 + 1) - Get(val[now]);
    for (int i = 0; i < Tree[now].size(); i++)
        DFS(Tree[now][i]);
    B = Get(1000000 + 1) - Get(val[now]);
    ans[now] = B - A;
    Update(val[now], 1);
}

int main()
{
    while (~scanf("%d", &n))
    {
        init();
        for (int i = 1; i < n; i++)
        {
            int k;
            scanf("%d", &k);
            Tree[k].push_back(i);
        }
        for (int i = 0; i < n; i++)
        {
            scanf("%d", &val[i]);
            val[i]++;
        }
        DFS(0);
        for (int i = 0; i < n; i++)
        {
            if (i < n - 1) printf("%d ", ans[i]);
            else printf("%d\n", ans[i]);
        }
    }
    return 0;
}

 

posted @ 2015-09-02 21:23  Fighting_Heart  阅读(175)  评论(0编辑  收藏  举报