Submission #438720

#TimeUsernameProblemLanguageResultExecution timeMemory
438720SorahISASjekira (COCI20_sjekira)C++17
110 / 110
115 ms13980 KiB
#include <bits/stdc++.h>
using namespace std;

#define int long long
#define double long double
using pii = pair<int, int>;
template <typename T>
using prior = priority_queue<T, vector<T>, greater<T>>;
template <typename T>
using Prior = priority_queue<T>;

#define X first
#define Y second
#define ALL(x) (x).begin(), (x).end()
#define eb emplace_back
#define fastIO() ios_base::sync_with_stdio(0), cin.tie(0)

const int maxn = 1E5 + 5;

int ans = 0;
vector<int> adj[maxn], val(maxn), deg(maxn), vis(maxn), p(maxn), maxV(maxn);

int R(int x) {return x ^ p[x] ? p[x] = R(p[x]) : x;}
void U(int x, int y) {x = R(x), y = R(y); maxV[y] = max(maxV[y], maxV[x]), p[x] = y;}

int32_t main() {
    fastIO();
    
    int n;
    cin >> n, iota(ALL(p), 0);
    
    vector<pii> pq;
    
    for (int i = 1; i <= n; ++i) cin >> val[i], maxV[i] = val[i], pq.eb(val[i], i);
    for (int i = 1; i < n; ++i) {
        int u, v; cin >> u >> v;
        adj[u].eb(v), adj[v].eb(u), ++deg[u], ++deg[v];
    }
    sort(ALL(pq), [](auto p1, auto p2) {return p1.X > p2.X;});
    
    for (int i = 0; i < n; ++i) {
        int id = pq[i].Y;
        ans += deg[id] * val[id];
        for (auto x : adj[id]) --deg[x];
    }
    
    // cout << ans << "\n";
    
    for (int i = n-1; i >= 0; --i) {
        int id = pq[i].Y; vis[id] = 1;
        for (auto x : adj[id]) {
            if (i != n-1 and vis[x]) ans += maxV[R(x)];
            if (vis[x]) U(id, x);
        }
    }
    
    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...