Submission #1063382

#TimeUsernameProblemLanguageResultExecution timeMemory
1063382ThylOnePower Plant (JOI20_power)C++14
0 / 100
3 ms5168 KiB
//####################
//PowerPlant
//####################
#include<bits/stdc++.h>

using namespace std;
const int maxiN = 2*1e5;
bool isPowerPlant[maxiN];
vector<int> links[maxiN];
int dp[2][maxiN];
int solve(bool cm,int node,int dad=-1){
	if(dp[cm][node]!=-1)return dp[cm][node];
	int re = 0;
	if(isPowerPlant[node])re=1;
	int malus = (cm && isPowerPlant[node]?1:0);
	for(int v:links[node])if(v!=dad){
		re = max(re, solve(false,v,node) - malus);
	}
	int sum = 0;
	for(int v:links[node])if(v!=dad){
		sum += solve(true,v,node);
	}
	sum -=malus;
	 // le malus prcq ça va se faire péter

	return dp[cm][node] = max(re,sum) ;
}
signed main(){
	ios::sync_with_stdio(false);
	int n;cin>>n;
	for(int i = 1;i<n;i++){
		int a,b;cin>>a>>b;
		a--;
		b--;
		links[a].push_back(b);
		links[b].push_back(a);
	}
	fill(dp[0],dp[0]+n,-1);
	fill(dp[1],dp[1]+n,-1);
	string binary;cin>>binary;
	for(int i= 0;i<n;i++)isPowerPlant[i] = (binary[i]=='1');
	int ans = max(solve(0,0),solve(1,0));
	for(int i = 0;i<1;i++){
		if(isPowerPlant[i]){
			for(int v:links[i])if(v!=i){
				ans = max(ans, 1+solve(1,v,i));
			}
		}
	}
	
	cout<<ans<<endl;
	return 0;
};
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...