记录编号 372066 评测结果 AAAAAAAAAA
题目名称 树的统计 最终得分 100
用户昵称 Gravatarsxysxy 是否通过 通过
代码语言 C++ 运行时间 0.390 s
提交时间 2017-02-17 17:08:59 内存使用 2.21 MiB
显示代码纯文本
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;
#define MAXN 100002
vector<int> G[MAXN];
int n;
int bit[MAXN];
void add(int x, int v){
  for(; x <= n; x += x&-x)bit[x] += v;
}
int query(int x){
  int r = 0;
  for(x--; x; x -= x&-x)r += bit[x];
  return r;
}
int ans[MAXN];
void dfs(int u, int f){
  add(u, 1);
  ans[u] = query(u);
  for(int i = 0; i < G[u].size(); i++){
    if(G[u][i] != f)dfs(G[u][i], u);
  }
  ans[u] = query(u)-ans[u];
}
int main()
{
  freopen("counttree.in", "r", stdin);
  freopen("counttree.out", "w", stdout);
  scanf("%d", &n);
  int r;
  for(int i = 1, f; i <= n; i++){
    scanf("%d", &f);
    if(f){
      G[f].push_back(i); G[i].push_back(f);
    }else r = i;
  }
  dfs(r, 0);
  for(int i = 1; i <= n; i++)printf(i==n?"%d\n":"%d ", ans[i]);
  return 0;
}