求条:(
查看原帖
求条:(
836448
stylus楼主2024/12/7 16:18

详见屎山

#include<bits/stdc++.h>
#define int long long
/*
不要以为你有后台你就可以乱看人代码,不要以为你有后台就乱来看别人。你没有代码!!!你,就是后台享有最高权力,你认为我是骂你的,你就抄吧,你甚至可以封我的号。但是,群众的眼睛是雪亮的!!!!
如果你看了我的代码,会让全天下的oiers知道,你的腐朽!!!
你将会臭名昭著!!!
*/
using namespace std;
void read(int &x){
	x=0;bool f=0;char ch=getchar();
	while(ch>'9'||ch<'0'){
		if(ch=='-')f=1;
		ch=getchar();
	}do{x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}while(ch>='0'&&ch<='9');
	x=f?-x:x;
}
int n,a[100001],d[100001],w[100001],c[100001],s[100001],l;
vector<int>v[100001];
bool ck(int x){
	return d[s[l]]-d[s[x-1]]<=c[l];
}
int ef(int l,int r){
	while(l<r){
		int mid=l+r>>1;
		if(ck(mid))r=mid;
		else l=mid+1;
	}return l;
}
void dfs(int x){
	a[x]=l-ef(1,l)+1;
	for(auto i:v[x]){
		s[++l]=i,d[i]=d[x]+w[i];
		dfs(i);
	}l--;
	return;
}
signed main(){
	read(n);
	for(int i=2;i<=n;i++)read(l),v[l].push_back(i);
	for(int i=1;i<=n;i++)read(w[i]);
	for(int i=1;i<=n;i++)read(c[i]);
	s[1]=l=1,d[1]=w[1],dfs(1);
	for(int i=1;i<=n;i++)cout<<a[i]<<' ';
	return 0;
}
2024/12/7 16:18
加载中...