比赛 NOIP2025模拟赛4 评测结果 WWWWWWWAAA
题目名称 Good Influencers 最终得分 30
用户昵称 123 运行时间 0.210 s
代码语言 C++ 内存使用 5.50 MiB
提交时间 2025-11-27 12:26:51
显示代码纯文本
#include <bits/stdc++.h>
using namespace std;
const int N=4e5+10; 
int n,c[N],idx[N],nxt[N],head[N],dp[N][5],tot=0;
string s;
inline void add(int x,int y)
{
	idx[++tot]=y;
	nxt[tot]=head[x];
	head[x]=tot;
} 
inline void dfs(int now,int fa)
{
	int mi=1e9,x=0;
	if (s[now]=='Y') dp[now][0]=1e9;
	dp[now][2]=(s[now]=='N' ? 1e9 : c[now]);
	for (int i=head[now];i;i=nxt[i])
	{
		int y=idx[i]; 
		if (y==fa) continue;
		dfs(y,now);
		if (s[now]=='Y')
		{
			dp[now][1]+=min(dp[y][1],dp[y][2]);
			dp[now][2]+=min(min(dp[y][0],dp[y][1]),dp[y][2]);
		}
		else
		{
			dp[now][0]+=min(dp[y][0],dp[y][1]);
			dp[now][1]+=min(dp[y][1],dp[y][2]),mi=min(mi,max(0,dp[y][2]-dp[y][1]));
			x+=min(dp[y][0],dp[y][1]);
		}
	} 
//	cout<<"It is "<<now<<" "<<dp[now][0]<<" "<<dp[now][1]<<" "<<dp[now][2]<<endl; 
	if (s[now]=='N')
	{
		for (int i=head[now];i;i=nxt[i])
		{
			int y=idx[i];
			if (y==fa) continue;
			if (s[now]=='N') dp[now][2]=min(dp[now][2],c[now]+x-min(dp[y][0],dp[y][1])+dp[y][2]);
		}
		if (s[now]=='N') dp[now][1]+=mi;
	}
//	cout<<"It is "<<now<<" "<<dp[now][0]<<" "<<dp[now][1]<<" "<<dp[now][2]<<endl; 
}
int main() {
	freopen("Influencers.in","r",stdin);
	freopen("Influencers.out","w",stdout); 
	ios::sync_with_stdio(0),cin.tie(0);
	cin>>n;
	for (int i=1;i<n;i++)
	{
		int x,y;
		cin>>x>>y;
		add(x,y),add(y,x);
	}
	cin>>s;
	s=' '+s; 
	for (int i=1;i<=n;i++) cin>>c[i];
	dfs(1,0);
	cout<<min(dp[1][1],dp[1][2]); 
}