比赛 NOIP2025模拟赛4 评测结果 AAAAAAAAAA
题目名称 Good Influencers 最终得分 100
用户昵称 梦那边的美好TE 运行时间 0.323 s
代码语言 C++ 内存使用 11.60 MiB
提交时间 2025-11-27 12:09:15
显示代码纯文本
#include <iostream>
#include <cstdio>
#include <vector>
#include <cstring>
using namespace std;
const int N=2e5+10;
const int inf=1e9+10;
typedef long long ll;
ll g[N][2][2],f[N][2];
int n,w[N];
char s[N];
vector<int>G[N];
void add(int x,int y){
	G[x].push_back(y);
} 
void dfs(int x,int fa){
	if(s[x]=='Y'){
		f[x][1]=w[x];
		f[x][0]=0;
	}else{
		g[x][1][1]=w[x];
		g[x][1][0]=0;
		if(G[x].size()>1){
			g[x][0][1]=0;
			g[x][0][0]=0;
		}else{
			g[x][0][1]=inf;
			g[x][0][0]=inf;
		}
	}
    for(auto y:G[x]){
        if(y==fa)continue;
        dfs(y,x);
        if(s[x]=='N'&&s[y]=='N'){
        	g[x][1][1]+=min(min(g[y][1][1],g[y][1][0]),min(g[y][0][1],g[y][0][0]));
        	g[x][1][0]+=min(g[y][0][0],g[y][0][1]);
		}else if(s[x]=='N'&&s[y]=='Y'){
			g[x][1][1]+=min(f[y][0],f[y][1]);
			g[x][1][0]+=min(f[y][0],f[y][1]);
		}else if(s[x]=='Y'&&s[y]=='N'){
			f[x][1]+=min(min(g[y][1][1],g[y][1][0]),min(g[y][0][1],g[y][0][0]));
			f[x][0]+=min(g[y][0][0],g[y][0][1]);
		}else if(s[x]=='Y'&&s[y]=='Y'){
			f[x][1]+=min(f[y][0],f[y][1]);
			f[x][0]+=min(f[y][0],f[y][1]);
		}
    }
    if(s[x]=='N'){
    	ll v1=inf,s1=g[x][1][1];
    	ll v2=inf,s2=g[x][1][0];
    	for(auto y:G[x]){
    		if(y==fa)continue;
    		if(s[y]=='N'){
    			v1=min(v1,s1-min(min(g[y][1][1],g[y][1][0]),min(g[y][0][1],g[y][0][0]))+g[y][0][1]);
    			v2=min(v2,s2-min(g[y][0][0],g[y][0][1])+g[y][0][1]);
			}else{
				v1=min(v1,s1-min(f[y][0],f[y][1])+f[y][1]);
				v2=min(v2,s2-min(f[y][0],f[y][1])+f[y][1]);
			}
		}
		g[x][0][1]=v1;
		g[x][0][0]=v2;
	}
	return;
}
int main(){
	freopen("Influencers.in","r",stdin);
	freopen("Influencers.out","w",stdout);
	scanf("%d",&n);
	for(int i=1,u,v;i<n;i++){
		scanf("%d %d",&u,&v);
		add(u,v),add(v,u);
	}
	scanf("%s",s+1);
	for(int i=1;i<=n;i++)scanf("%d",w+i);
	dfs(1,0);
	if(s[1]=='Y')printf("%d\n",min(f[1][0],f[1][1]));
	else printf("%d\n",min(g[1][0][1],g[1][0][0]));
	return 0;
}