题目https://www.luogu.com.cn/problem/P3605离散化+树状数组。
先将数据进行离散化:
sort(b+1,b+n+1);
for(int i=1;i<=n;i++){
a[i]=lower_bound(b+1,b+n+1,a[i])-b;
}
然后开始遍历整棵树,先将之前比它大的奶牛数量去掉(是它的上级不用管),然后继续向下遍历,加上所有比它大的奶牛数目。
实现
#include<bits/stdc++.h>
using namespace std;
#define int long long
int n,a[100005],b[100005],c[100005],ans[100005];
vector<int>v[100005];
int lowbit(int x){
return x&(-x);
}
int query(int x){
int sum=0;
while(x){
sum+=c[x];
x-=lowbit(x);
}
return sum;
}
void modify(int x,int val){
while(x<=n){
c[x]+=val;
x+=lowbit(x);
}
}
void dfs(int x){
ans[x]-=(query(n)-query(a[x]));
for(auto z:v[x]){
dfs(z);
}
ans[x]+=(query(n)-query(a[x]));
modify(a[x],1);
}
signed main(){
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
b[i]=a[i];
}
sort(b+1,b+n+1);
for(int i=1;i<=n;i++){
a[i]=lower_bound(b+1,b+n+1,a[i])-b;
}
for(int i=2,x;i<=n;i++){
cin>>x;
v[x].push_back(i);
}
dfs(1);
for(int i=1;i<=n;i++){
cout<<ans[i]<<'\n';
}
return 0;
}