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

只能过两个数据 不知道错在哪了

全部评论
什么逆天代码赶紧换个思路
点赞 回复 分享
发布于 2023-12-25 00:07 北京

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务