样例过了但 0pts 玄关求调
查看原帖
样例过了但 0pts 玄关求调
637073
wujingfey楼主2024/10/23 11:43
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e5+6;
int n,ans1,a[N],b[N];
struct NODE{
	int f,g;
}dp[N];
//f:u点最少下放人数
//g:u子树下放后能返回上级人数 
vector<int> e[N];
bool cmp(NODE a1,NODE a2){
	return a1.g>a2.g;
}
void dfs(int u,int fa){
	vector<NODE> v;
	v.clear();
	for(auto to:e[u]){
		if(to==fa) continue;
		dfs(to,u);
		v.push_back(dp[to]);
	}
	dp[u]={a[u],a[u]-b[u]};
	v.push_back(dp[u]);
	sort(v.begin(),v.end(),cmp);
	int ans=0,now=0;
	//ans:这颗子树至少下放,now:当前人数 
	for(int i=0;i<v.size();i++){
		if(now<v[i].f){//当前人数不够下放新的子树 
			ans+=(v[i].f-now);//补全 
			now=v[i].f;
		}
		now=now-v[i].f+v[i].g;//更新新的剩余人数 
	}
	dp[u]={ans,now};
} 
signed main(){
	ios::sync_with_stdio(false);
	cin.tie(0);
	cin>>n;
	for(int i=1;i<=n;i++) cin>>a[i];
	for(int i=1;i<=n;i++) cin>>b[i];
	for(int i=2;i<=n;i++){
		int x,y;
		cin>>x>>y;
		e[i].push_back(x);
		e[x].push_back(i);
		ans1+=2*y;
	}
	cout<<ans1<<" ";
	dfs(1,0);
	cout<<dp[1].f;
	return 0;
}

以及一组 hack:

6
5 9 9 10 10 14 
5 1 2 2 2 12 
1 2
2 2
2 5
4 1
5 1

std ans:22 26
my ans:22 24
2024/10/23 11:43
加载中...