제출 #630173

#제출 시각아이디문제언어결과실행 시간메모리
630173Hacv16Sjekira (COCI20_sjekira)C++17
110 / 110
80 ms58940 KiB
#include<bits/stdc++.h> using namespace std; typedef long long ll; typedef pair<int, int> pii; const int MAX = 2e6 + 15; const int INF = 0x3f3f3f3f; const int MOD = 1e9 + 7; #define pb push_back #define sz(x) (int) x.size() #define fr first #define sc second #define mp make_pair #define all(x) x.begin(), x.end() #define dbg(x) cerr << #x << ": " << "[ " << x << " ]\n" ll n, t[MAX], pai[MAX], mark[MAX], mx[MAX], sze[MAX], ans; vector<ll> adj[MAX]; ll find(ll u){ if(pai[u] == u) return u; return pai[u] = find(pai[u]); } ll join(ll u, ll v){ u = find(u), v = find(v); if(u == v) return 0; if(sze[v] > sze[u]) swap(u, v); ll cut = mx[u] + mx[v]; pai[v] = u, sze[u] += sze[v], mx[u] = max(mx[u], mx[v]); return cut; } ll getMax(ll u){ return mx[find(u)]; } bool cmp(ll u, ll v){ return t[u] > t[v]; } int main(){ ios_base::sync_with_stdio(false); cin.tie(NULL); cin >> n; for(int i = 1; i <= n; i++) cin >> t[i]; for(int i = 1; i < n; i++){ ll u, v; cin >> u >> v; adj[u].pb(v); adj[v].pb(u); } for(int i = 1; i <= n; i++) pai[i] = i, mx[i] = t[i], sze[i] = 1; vector<ll> order(n); iota(all(order), 1); sort(all(order), cmp); vector<pii> edges; for(auto u : order){ for(auto v : adj[u]){ if(mark[v]) continue; edges.pb({u, v}); } mark[u] = true; } reverse(all(edges)); for(auto e : edges) ans += join(e.fr, e.sc); cout << ans << '\n'; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...