比赛 NOIP2025模拟赛4 评测结果 WWWWWWWAAW
题目名称 Good Influencers 最终得分 20
用户昵称 郑霁桓 运行时间 0.345 s
代码语言 C++ 内存使用 11.81 MiB
提交时间 2025-11-27 12:27:41
显示代码纯文本
#include<bits/stdc++.h>
using namespace std;
long long n,xx,yy,a[200005],c[200005],dp[200005][2][2],ps; 
vector<long long>v[200005];
string str;
inline void dfs(long long x,long long fa){
	for(int i=0;i<v[x].size();i++){
		if(v[x][i]==fa) continue;
		dfs(v[x][i],x);
	}
	if(a[x]){
		for(int i=0;i<v[x].size();i++){
			if(v[x][i]==fa) continue;
			dp[x][1][0]+=min(dp[v[x][i]][1][0],dp[v[x][i]][1][1]);
			dp[x][1][1]+=min(min(dp[v[x][i]][1][0],dp[v[x][i]][0][0]),dp[v[x][i]][1][1]);
		}
		dp[x][1][1]+=c[x];
		dp[x][0][0]=1e9;
	}else{
		long long s1=0,s2=0;
		for(int i=0;i<v[x].size();i++){
			if(v[x][i]==fa) continue;
			dp[x][0][0]+=dp[v[x][i]][1][0];
			s1+=min(min(dp[v[x][i]][1][0],dp[v[x][i]][0][0]),dp[v[x][i]][1][1]);
			s2+=min(min(dp[v[x][i]][1][0],dp[v[x][i]][0][0]),dp[v[x][i]][1][1]);
		}
		dp[x][1][0]=dp[x][1][1]=1e9;
		for(int i=0;i<v[x].size();i++){
			if(v[x][i]==fa) continue;
			if(dp[v[x][i]][1][1]<1e9) dp[x][1][0]=min(dp[x][1][0],max(0ll,s1-min(0ll,dp[v[x][i]][1][0])+dp[v[x][i]][1][1]));
			if(dp[v[x][i]][1][1]<1e9) dp[x][1][1]=min(dp[x][1][1],max(0ll,s2-min(0ll,dp[v[x][i]][1][0])+dp[v[x][i]][1][1]+c[x]));
		}
		dp[x][1][1]=min(dp[x][1][1],dp[x][1][0]+c[x]);
		if(dp[x][0][0]>=1e9){
			dp[x][0][0]=c[x];
			for(int i=0;i<v[x].size();i++){
				if(v[x][i]==fa||v[v[x][i]].size()==1) continue;
				dp[x][0][0]+=dp[v[x][i]][0][0];
			}
		}
		int p=-1;
		for(int i=0;i<v[x].size();i++){
			if(v[x][i]==fa) continue;
			if(dp[v[x][i]][1][0]>=1e9&&dp[v[x][i]][1][1]>=1e9) p=1,dp[x][1][0]=1e9;
		}
		for(int i=0;i<v[x].size();i++){
			if(v[x][i]==fa) continue;
			if(dp[v[x][i]][1][0]<1e9&&dp[v[x][i]][1][1]<1e9&&p==1) p=0;
		}
		if(p==0) dp[x][0][0]=1e9;
	}
	return;
}
int main(){
	freopen("Influencers.in","r",stdin);
	freopen("Influencers.out","w",stdout);
	ios::sync_with_stdio(false);
	cin>>n;
	for(int i=1;i<n;i++){
		cin>>xx>>yy;
		v[xx].push_back(yy);
		v[yy].push_back(xx);
	}
	cin>>str;
	for(int i=0;i<str.size();i++){
		a[i+1]=(str[i]=='Y');
	}
	for(int i=1;i<=n;i++) cin>>c[i];
	dfs(1,0);
	cout<<(min(dp[1][1][0],dp[1][1][1])+1)/2;
    return 0;
}