周赛25 D T
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=4000010;
const int M=400020;
int h[N],ne[M],e[M],idx=0,n;
int p[N],size1[N];
void add(int a,int b)
{
e[idx]=b;
ne[idx]=h[a];
h[a]=idx++;
}
int st[N];
int color[N];
int sum1=0;
int dfs(int u)
{
st[u]=1;
for(int i=h[u];i!=-1;i=ne[i])
{
int j=e[i];
if(st[j])continue;
size1[u]+=dfs(j);
if(color[u]==color[j])size1[u]-=1;
}
return size1[u];
}
int ans=0;
void bfs()
{
queue<int>q;
q.push(1);
while(q.size())
{
int t=q.front();
q.pop();
st[t]=1;
for(int i=h[t];i!=-1;i=ne[i])
{
int j=e[i];
if(st[j])continue;
int f=0;
if(color[t]==color[j])f=1;
int op=sum1-size1[j]+f;
ans+=abs(op-size1[j]);
q.push(j);
st[j]=1;
}
}
}
void so()
{
cin>>n;
string s;
cin>>s;
s=" "+s;
memset(h,-1,sizeof h);
for(int i=1;i<=n;i++)
{
size1[i]=1;
}
for(int i=1;i<=n;i++)
{
if(s[i]=='B')color[i]=0;
else color[i]=1;
}
for(int i=1;i<n;i++)
{
int a,b;
cin>>a>>b;
add(a,b);
add(b,a);
}
dfs(1);
sum1=size1[1];
memset(st,0,sizeof st);
bfs();
cout<<ans;
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
int t;
t=1;
//cin>>t;
while(t--)
{
so();
// cout<<endl;
}
return 0;
}
只能过两个数据 不知道错在哪了

