제출 #1331746

#제출 시각아이디문제언어결과실행 시간메모리
1331746WH8The Xana coup (BOI21_xanadu)C++17
0 / 100
82 ms28332 KiB
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define f first
#define s second

signed main(){
	int n; cin >> n;
	vector<int> s(n+1, 0);
	vector<vector<int>> al(n+1);
	for(int i=0;i<n-1;i++){
		int a,b;cin>>a>>b;
		al[a].push_back(b);
		al[b].push_back(a);
	}
	for(int i=1;i<=n;i++)cin>>s[i];
	vector<array<array<int,2>,2>> dp(n+1);
	for(int i=0;i<=n;i++){
		for(int j=0;j<2;j++){
			for(int k=0;k<2;k++){
				dp[i][j][k]=INT_MAX;
			}
		}
	}
	auto solve=[&](vector<array<int,2>> v)->array<int,2>{
		int nc=v.size();
		sort(v.begin(),v.end(), [&](auto a, auto b){
			return a[1] - a[0] < b[1] - b[0];
		});
		int sm=0, run=0;
		array<int, 2> d={0,INT_MAX};
		for(int i=0;i<nc;i++){
			sm += v[i][0];
			if(v[i][1] <= v[i][0]){
				run += v[i][1] - v[i][0];
				d[(i+1)%2] = run;
			}
		}
		return array<int,2>{sm+d[0], sm+d[1]};
	};
	auto dfs=[&](auto && dfs, int x, int p)->void{
		array<vector<array<int,2>>, 2> ch;
		int nc=0;
		for(auto it : al[x]){
			if(it==p)continue;
			nc++;
			dfs(dfs, it, x);
			ch[0].push_back(dp[it][0]);
			ch[1].push_back(dp[it][1]);
		}
		if(nc){
			array<int, 2> res0, res1;
			res0=solve(ch[0]);
			res1=solve(ch[1]);
			dp[x][s[x]][0]=res0[0];
			dp[x][s[x]^1][0]=res0[1];
			dp[x][s[x]^1][1]=res1[0]+1;
			dp[x][s[x]][1]=res1[1]+1;
		}
		else {
			dp[x][s[x]][0]=0;
			dp[x][!s[x]][1]=1;
		}
		/*cout<<x<<endl;
		cout<<dp[x][0][0]<<" "<<dp[x][0][1]<<endl;
		cout<<dp[x][1][0]<<" "<<dp[x][1][1]<<endl;*/
	};
	dfs(dfs, 1, 0);
	int ans=min(dp[1][0][0], dp[1][0][1]);
	if(ans > INT_MAX / 2){
		cout<<"impossible";
	}
	else cout<<ans;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...