Submission #1305222

#TimeUsernameProblemLanguageResultExecution timeMemory
1305222neonglitchPower Plant (JOI20_power)C++20
100 / 100
99 ms29348 KiB
#include <iostream>
#include <vector>
using namespace std;
const int N=2e5+10;
vector<int> ma[N];
int sp[N],dp[N][2],ans=0;
void dfs(int x,int p=0)
{
	dp[x][0]=-sp[x];
	dp[x][1]=sp[x];
	for(auto y:ma[x])
		if(y^p)
			dfs(y,x),dp[x][0]+=max(dp[y][0],dp[y][1]);
}
void update(int x)
{
	int sm=0;
	for(auto y:ma[x])
	{
		ans=max(ans,max(dp[y][0],dp[y][1])+1);
		sm+=max(dp[y][0],dp[y][1]);
	}
	sm--;
	ans=max(ans,sm);
}
void reroot(int x,int y)
{
	dp[x][0]-=max(dp[y][0],dp[y][1]);
	
	dp[y][0]+=max(dp[x][0],dp[x][1]);
}
void dfs_(int x,int p=0)
{
	if(sp[x])
		update(x);
	for(auto y:ma[x])
		if(y^p)
		{
			reroot(x,y);
			dfs_(y,x);	
			reroot(y,x);
		}
}
int main()
{
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	int n;
	cin>>n;
	for(int i=1;i<n;i++)
	{
		int x,y;
		cin>>x>>y;
		ma[x].push_back(y);
		ma[y].push_back(x);
	}
	for(int i=1;i<=n;i++)
	{
		char c;
		cin>>c;
		sp[i]=c-'0';
	}
	ans=1;
	for(int i=1;i<=n;i++)
	{
		if(sp[i])
		{
			dfs(i);
			dfs_(i);
			break;
		}
	}
	cout<<ans<<endl;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...