题解:AT_abc246_g [ABC246G] Game on Tree 3
Danslapiscine · · 题解
简单题。
按照结果的
鲜花:出成联赛模拟 T2,
#include <bits/stdc++.h>
using namespace std;
inline int rd(){
char c = getchar();
while((c > '9' || c < '0') && c != '-') c = getchar();
int ret = 0;
while(c >= '0' && c <= '9') ret = (ret << 3) + (ret << 1) + c - '0', c = getchar();
return ret;
}
int n;
int father[200002];
vector<int> vec[200002];
void init(int pos,int faa){
father[pos] = faa;
for(int i=0;i<vec[pos].size();i++){
if(vec[pos][i] == faa) continue;
init(vec[pos][i], pos);
}
}
pair<int,int> Data[200002];
int fa[200002], cnt[200002], node[2000002];
int getfa(int u){
if(fa[u] == u) return u;
fa[u] = getfa(fa[u]);
return fa[u];
}
int main(){
n = rd();
for(register int i=1;i<=n;i++) fa[i] = i, cnt[i] = 1, node[i] = i;
for(register int i=1;i<=n-1;i++){
scanf("%d",&Data[i].first);
Data[i].second = i + 1;
}
for(int i=1;i<n;i++){
int u, v;
scanf("%d%d",&u,&v);
vec[u].push_back(v);
vec[v].push_back(u);
}
sort(Data+1,Data+n);
init(1, 0);
register int i;
for(i=n-1;i>=1;i--){
int u = getfa(father[Data[i].second]);
if(node[u] == 0) break;
if(node[u] == 1) {
node[u] = 0;
continue;
}
int v = getfa(father[node[u]]);
int then = node[v];
if(cnt[u] > cnt[v]) swap(u, v);
cnt[v] += cnt[u], fa[u] = v;
node[v] = then;
}
printf("%d",Data[i].first);
return 0;
}