Submission #1326065

#TimeUsernameProblemLanguageResultExecution timeMemory
1326065joacruPower Plant (JOI20_power)C++20
0 / 100
1 ms332 KiB
#include <iostream>
#include <algorithm>
#include <vector>

#define forn(i,n) for(int i=0;i<(int)n;++i)
#define fori(i,a,n) for(int i=a;i<(int)n;++i)

#define DBG(a) cerr<<#a<<" = "<<a<<endl
#define DBGA(a) cerr<<#a<<" = "<<a<<", ";
#define DBG2(a,b) do{DBGA(a)DBG(b);}while(0)
#define DBG3(a,b,c) do{DBGA(a)DBGA(b)DBG(c);}while(0)
#define DBG4(a,b,c,d) do{DBGA(a)DBGA(b)DBGA(c)DBG(d);}while(0)
#define SZ(v) (int)v.size()

using namespace std;

template<typename T>
ostream &operator<<(ostream &os, vector<T> &v){
	os<<"[";
	forn(i,SZ(v)){
		if(i) os<<", ";
		os<<v[i];
	}
	os<<"]";
	return os;
}

const int MAXN = 200005;

int ans = 0;
vector<int> g[MAXN];
string s;
int dp[MAXN];

int dfs1(int u, int p){ // calcula cuanto le pasa al padre
	dp[u] = s[u] == '1';
	int sum = 0;
	for(int v: g[u]){
		if(v == p) continue;
		sum += dfs1(v, u);
	}
	if(sum && s[u] == '1') --sum; // rompe el actual
	dp[u] = max(dp[u], sum);
	return dp[u];
}

void dfs2(int u, int p, int c){ // calcula este como el centro, c es lo del padre
	int sum = c, brs = c != 0; // el padre cuenta como rama solo si aporta
	for(int v: g[u]){
		if(v == p) continue;
		sum += dp[v];
		brs += bool(dp[v]); // cantidad de ramas usadas
	}
	int aux = sum;
	if(brs > 1 && s[u] == '1') --aux;
	ans = max(ans, aux);
	
	// mandar a los hijos
	for(int v: g[u]){
		if(v == p) continue;
		aux = sum - dp[v]; // suma de todos mis hijos
		if(aux > 1 && s[u] == '1') --aux; // me rompe
		aux = max(aux, int(s[u] == '1')); // si me quedo en 0, mejor me quedo conmigo mismo
		dfs2(v,u,aux);
	}
}

int main(){
	
	#ifdef LOCAL
	freopen("input.in", "r", stdin);
	#endif
	
	int n;
	cin>>n;
	
	fori(i,1,n){
		int u, v;
		cin>>u>>v;
		--u, --v;
		g[u].push_back(v);
		g[v].push_back(u);
	}
	
	cin>>s;
	
	dfs1(0,-1);
	dfs2(0,-1,0);
	
	cout<<ans<<"\n";
	
	return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...