| 比赛 |
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;
}