제출 #1283422

#제출 시각아이디문제언어결과실행 시간메모리
1283422Jawad_Akbar_JJPower Plant (JOI20_power)C++20
100 / 100
93 ms29808 KiB
#include <iostream>
#include <vector>

using namespace std;
vector<int> nei[1<<18];
int Up[1<<18], dp[1<<18], Ans;
string s;

void dfs0(int u, int p){
	for (int i : nei[u]){
		if (i == p)
			continue;
		dfs0(i, u);
		dp[u] += dp[i];
		if (s[u - 1] == '1')
			Ans = max(Ans, dp[i] + 1);
	}
	dp[u] = max(s[u - 1] - '0', dp[u] - (s[u-1] == '1'));
}

void dfs1(int u, int p, int chSum = 0){
	Ans = max(Ans, dp[u] + Up[p]);

	for (int i : nei[u])
		if (i != p)
			chSum += dp[i];

	for (int i : nei[u]){
		if (i == p)
			continue;
		chSum -= dp[i];
		Up[u] = max(s[u - 1] - '0', chSum + Up[p] - (s[u - 1] == '1'));

		dfs1(i, u);
		chSum += dp[i];
	}
}

signed main(){
	ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
	int n;
	cin>>n;

	for (int i=1, a, b;i<n;i++){
		cin>>a>>b;
		nei[a].push_back(b);
		nei[b].push_back(a);
	}

	cin>>s;

	dfs0(1, 0);
	dfs1(1, 0);

	cout<<Ans<<'\n';
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...