El significado de los problemas
Elegir un árbol un bloque de comunicación, de manera que Lo más grande posible, en base a lo grande, y mucho lo más grande posible
solución del problema
Consideramos que, al parecer colección pelotón inversa, si ha elegido
una, la primera para elegir
.
Comparar el tamaño, porque
Solicitar
, se encuentra
, que se conoce condiciones, solamente un seleccionado que es óptima.
pero
sea el mejor, de modo que una pluralidad de valor máximo seleccionado de un conjunto de requisitos.
Tratando de
es un nodo raíz, el valor máximo de esto debe tomar abajo el punto (mismo conjunto)
tiene claramente:
Obtener la máxima suma, sin hueso nuevo , cada vez que el mismo que el máximo y que, Como la corriente es igual a infinito negativo, a continuación, vuelta hacia atrás. Eso se puede garantizar que no se solapen.
#include<bits/stdc++.h>
#define FOR(i,l,r) for(int i=l;i<=r;i++)
#define sf(x) scanf("%d",&x)
#define inf 0x3f3f3f3f3f3f3f3f
using namespace std;
typedef long long ll;
const int maxn = 405000;
int n,A[maxn];
vector<int>G[maxn];
ll dp[maxn],ans=-inf,k;
void dfs1(int u,int f){
dp[u]=A[u];
for(auto v:G[u]){
if(v==f)continue;
dfs1(v,u);
dp[u]+=max(dp[v],1ll*0);
}
ans=max(ans,dp[u]);
}
void dfs2(int u,int f){
dp[u]=A[u];
for(auto v:G[u]){
if(v==f)continue;
dfs2(v,u);
dp[u]+=max(dp[v],1ll*0);
}
if(dp[u]==ans){
k++;
dp[u]=-inf;
}
}
int main(){
cin>>n;
FOR(i,1,n)dp[i]=-inf;
FOR(i,1,n)scanf("%d",&A[i]);
FOR(i,1,n-1){
int u,v;
scanf("%d%d",&u,&v);
G[u].push_back(v);
G[v].push_back(u);
}
dfs1(1,-1);
dfs2(1,-1);
cout<<ans*k<<" "<<k<<endl;
}