灵异40分
查看原帖
灵异40分
543206
shiroko2008楼主2022/8/18 13:25

跟题解对了二百组拍,没对出错,交上去只有40分,WA

#include<iostream>
#include<algorithm>
#include<vector>
#include<cstring>
using namespace std;
int subtree[600000];
int c[600000];
int q[600000],r[600000];
vector<int> G[600000];
bool cmp (int i,int j) {
	int r=max((2*subtree[j]+q[i]+1),(q[j]+1));
	int l=max((2*subtree[i]+q[j]+1),(q[i]+1));
	return l<r;
}
int sub_tree (int u) {
	subtree[u]=1;
	for (int i=0;i<G[u].size();i++) subtree[u]+=sub_tree(G[u][i]);
	//cout<<u<<' '<<subtree[u]<<endl;
	return subtree[u];
}
int dfs (int u) {
	for (int i=0;i<G[u].size();i++) {
		q[G[u][i]]=dfs(G[u][i]);
	}
	sort(G[u].begin(),G[u].end(),cmp);
	int ans=0,tot=0;
	for (int i=0;i<G[u].size();i++) {
		ans=max(ans,q[G[u][i]]+tot*2+1);
		//cout<<G[u][i]<<' '<<q[G[u][i]]<<' '<<tot<<endl;
		tot+=subtree[G[u][i]];
		//tot*=2;
	}
	ans=max(ans,c[u]);
	//cout<<u<<' '<<ans<<endl;
	return ans;
}
int main()
{
	int n;
	cin>>n;
	for (int i=0;i<n;i++) cin>>c[i];
	for (int i=1;i<n;i++) {
		int f,t;
		cin>>f>>t;
		f--,t--;
		if (f>t) swap(f,t);
		G[f].push_back(t);
	}
	//cout<<endl;
	sub_tree(0);
	cout<<max(dfs(0),n*2-2+c[0]);
	return 0;
}
2022/8/18 13:25
加载中...