求调CF D
  • 板块学术版
  • 楼主zxh923
  • 当前回复2
  • 已保存回复2
  • 发布时间2024/8/31 01:06
  • 上次更新2024/8/31 11:47:59
查看原帖
求调CF D
795784
zxh923楼主2024/8/31 01:06
#include<bits/stdc++.h>
#define int long long
#define N 800005
#define M 800005
#define pii pair<int,int>
#define x first
#define y second
#define mod 1000000007
using namespace std;
int T=1,n,h[N],e[M],ne[M],deg[N],idx;
char s[N];
vector<int>son;
void add(int a,int b){
	e[idx]=b;ne[idx]=h[a];h[a]=idx++;deg[b]++;
}
void dfs(int u,int fa){
	if(u!=1&&deg[u]==1)son.push_back(u);
	for(int i=h[u];~i;i=ne[i]){
		int j=e[i];
		if(j==fa)continue;
		dfs(j,u);
	}
}
void solve(int cs){
	cin>>n;
	idx=0;
	son.clear();
	for(int i=1;i<=n;i++){
		h[i]=-1;
		deg[i]=0;
	}
	int now=0;
	for(int i=1;i<n;i++){
		int a,b;
		cin>>a>>b;
		if(a==1||b==1)now++;
		add(a,b);add(b,a);
	}
	int tot=0;
	cin>>s+1;
	for(int i=1;i<=n;i++){
		if(s[i]=='?')tot++;
	}
	dfs(1,0);
	if(s[1]=='?'){
		int sum0=0,sum1=0,que=0;
		for(auto it:son){
			if(s[it]=='0')sum0++;
			if(s[it]=='1')sum1++;
			if(s[it]=='?')que++;
		}
		if(sum0==sum1){
			if(tot==que+1){
				cout<<sum0+que/2<<'\n';
			}
			else{
				cout<<sum0+(que+1)/2<<'\n';
			}
		}
		else{
			cout<<max(sum0,sum1)+que/2<<'\n';
		}
	}
	else{
		int cnt=0,sum=0;
		for(auto it:son){
			if(s[it]!='?'&&s[it]!=s[1]){
				cnt++;
			}
			if(s[it]=='?')sum++;
		}
		cout<<cnt+(sum+1)/2<<'\n';
	}
}
signed main(){
	ios::sync_with_stdio(0);
	cin.tie(0);cout.tie(0);
	cin>>T;
	for(int cs=1;cs<=T;cs++){
		solve(cs);
	}
	return 0;
}

wa on 2

2024/8/31 01:06
加载中...