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;
}