Find the Maximum(昆明ICPC)

链接:https://ac.nowcoder.com/acm/contest/32708/F

这个结论非常重要!!!

实际操作方面 长度为2的话 相当于直接相连的两个点

长度为3的话感觉很麻烦 可以维护最大最小 次大次小 答案为 (最大+次大) 或者 (最小+次小) 或者 (长度为3的链)

这样可做但是麻烦了 实际上对每个点进行排序即可 这样上面三种情况就都包含进去了

核心在于有些时候父亲转移和儿子要分开 比如找到一条路径 这个时候不分开却是最方便的

code:

#include<bits/stdc++.h>
#define ll long long
#define N 200005
using namespace std;
int b[N];
vector<int>e[N];
int cmp(int x,int y){
	return b[x]<b[y];
}
int main(){
	int n,x,y,i,j;
	double m=0;
	cin>>n;
	for(i=1;i<=n;++i)cin>>b[i];
	for(i=1;i<n;++i){
		cin>>x>>y;
		m=max(m,fabs(b[x]+b[y])*0.5);
		e[x].push_back(y);
		e[y].push_back(x);
	}
	for(i=1;i<=n;++i){
		sort(e[i].begin(),e[i].end(),cmp);
		if(e[i].size()>=2){
			int t=e[i].size();
			m=max(m,fabs(b[i]+b[e[i][0]]+b[e[i][1]])/3);
			m=max(m,fabs(b[i]+b[e[i][t-1]]+b[e[i][t-2]])/3);
		}
	}
	printf("%lf\n",m*m*0.25);
	return 0;
}


posted @ 2022-07-16 13:03  wzx_believer  阅读(53)  评论(0编辑  收藏  举报