代码求调,悬赏关注!!
查看原帖
代码求调,悬赏关注!!
769006
crzcqh楼主2023/7/13 09:39
#include<iostream>
#include<vector>
#define M 10005
using namespace std;
vector<int> edge[M];
int fa[M],w[M],v[M],depth[M],dis[M];
//depth深度 dis离根的距离
int n,u;
void dfs(int u,int fa){
	depth[u]=depth[fa]+1;
	dis[u]=dis[fa]+v[u];
	for(int i=0;i<edge[u].size();i++){
		dfs(edge[u][i],u);
	}
}
int main(){
	cin>>n;
	edge[0].push_back(1); 
	for(int i=2;i<=n;i++){
		cin>>u;
		edge[u].push_back(i); 
		fa[i]=u;
	}
	for(int i=1;i<=n;i++) cin>>v[i];
	for(int i=1;i<=n;i++) cin>>w[i]; 
	dfs(1,0);
//	for(int i=1;i<=n;i++){
//		cout<<depth[i]<<' '<<dis[i]<<endl;
//	}
	int l,r,ans,mid;
	for(int i=1;i<=n;i++){
		l=0,r=depth[i];
		while(l<r){
			mid=(l+r)>>1;
			if(dis[mid]>w[i]){
				r=mid;
			}
			if(dis[mid]<=w[i]){
				l=mid+1;
				ans=max(ans,dis[mid]);
			}
		}
		cout<<ans<<' ';
	} 
	return 0;
}
2023/7/13 09:39
加载中...