Codeforces - Chloe and pleasant prizes

题目链接:Codeforces - Chloe and pleasant prizes


两颗子树必然存在一个公共祖先,枚举公共祖先即可。

然后从公共祖先的儿子中选最大的两个子树。


AC代码:

#pragma GCC optimize("-Ofast","-funroll-all-loops")
#include
#define int long long
using namespace std;
const int N=2e5+10;
int n,a[N],mx[N],sum[N],res=-1e18;
vector<int> g[N];
void dfs(int x,int fa){
	sum[x]=a[x]; int mx1=-1e18,mx2=-1e18;
	for(int to:g[x]) if(to!=fa){
		dfs(to,x); sum[x]+=sum[to];
		if(mx[to]>mx1) mx2=mx1,mx1=mx[to];
		else if(mx[to]>mx2) mx2=mx[to];
		mx[x]=max(mx[x],mx[to]);
	}
	mx[x]=max(mx[x],sum[x]);
	res=max(res,mx1+mx2);
}
signed main(){
	cin>>n;
	for(int i=1;i<=n;i++)	cin>>a[i],mx[i]=-1e18;
	for(int i=1,a,b;i<n;i++) cin>>a>>b,g[a].push_back(b),g[b].push_back(a);
	dfs(1,0);
	if(res<-1e17)	return puts("Impossible"),0;
	cout<<res;
	return 0;
}

你可能感兴趣的:(Codeforces,树形dp,动态规划)