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