→题目链接←
【想说的话】
没有写过树状数组...
这算是我 树状数组初体验 ?
【题解】
先按能力值从大到小排序,然后找到每个牛的名次
之后一边dfs,一边用树状数组统计
【代码】
#include<bits/stdc++.h>
#define MAXN 100010
using namespace std;
inline int rd(){
int x=0,y=1;char c=getchar();
while(c<'0' || c>'9'){if(c=='-')y=-y;c=getchar();}
while(c>='0'&&c<='9')x=x*10+c-'0',c=getchar();
return x*y;
}
struct node{
int val,num;
friend bool operator < (node a,node b){
return a.val>b.val;
}
};
int n,a[MAXN],sum[MAXN],ans[MAXN];
node cow[MAXN];
vector<int>v[MAXN];
inline int lowbit(int x){
return x&(-x);
}
inline void add(int x,int k){
for(int i=x; i<=n; i+=lowbit(i))sum[i]+=k;
}
inline int ask(int x){
int ret=0;
for(int i=x; i>0; i-=lowbit(i))ret+=sum[i];
return ret;
}
void dfs(int x){
ans[x]-=ask(a[x]);
for(int i=0; i<v[x].size(); i++)dfs(v[x][i]);
ans[x]+=ask(a[x]);
add(a[x],1);
}
int main(){
n=rd();
for(int i=1; i<=n; i++)cow[i].val=rd(),cow[i].num=i;
for(int i=2; i<=n; i++)v[rd()].push_back(i);
sort(cow+1,cow+n+1);
for(int i=1; i<=n; i++)a[cow[i].num]=i;
dfs(1);
for(int i=1; i<=n; i++)printf("%d\n",ans[i]);
return 0;
}