为何厌氧
查看原帖
为何厌氧
823137
lcx2011楼主2024/8/7 15:58
#include <bits/stdc++.h>
using namespace std;
int n,p[1000010],b[1000010];
int lowbit(int x){
	return x&(-x);
}
struct qxx{
	int to,nxt;
}g[1000010];int cnt,head[1000010];
void add(int u,int v){
	g[++cnt].to=v;
	g[cnt].nxt=head[u];
	head[u]=cnt;
}
int c[1000010];
int query(int x){
	int sum=0;
	while(x) sum+=c[x],x-=lowbit(x);
	return sum;
}
int change(int x,int k){
	while(x<=n) c[x]+=k,x+=lowbit(x);
}
int ans[1000010];
void dfs(int x){
	ans[x]-=query(n)-query(p[x]);
	for(int i=head[x];i;i=g[i].nxt) dfs(g[i].to);
	ans[x]+=query(n)-query(p[x]);
	change(p[x],1);
}
int main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>p[i];
		b[i]=p[i];
	}
	sort(b+1,b+1+n);
	for(int i=1;i<=n;i++){
		p[i]=lower_bound(b+1,b+1+n,p[i])-b;
	}
	for(int i=2;i<=n;i++){
		int x;
		cin>>x;
		add(x,i);
	}
	dfs(1);
	for(int i=1;i<=n;i++){
		cout<<ans[i]<<endl;
	}
	return 0;
} 
2024/8/7 15:58
加载中...