Submission #1287703

#TimeUsernameProblemLanguageResultExecution timeMemory
1287703shidou26Sjekira (COCI20_sjekira)C++20
110 / 110
48 ms7624 KiB
#include <bits/stdc++.h>
using namespace std;

const int N = 1e5 + 3;

int n;
int t[N];
vector<int> adj[N];

bool vis[N];
long long answer = 0;

struct DisjointSet {
    vector<int> lab, save;
    DisjointSet (int n) : lab(n + 3, -1), save(n + 3) {}

    void load() {
        for(int i = 1; i <= n; i++) {
            lab[i] = -1;
            save[i] = t[i];
        }
    }

    int root(int u) {
        return lab[u] < 0 ? u : lab[u] = root(lab[u]);
    }

    bool unite(int u, int v) {
        u = root(u); v = root(v);
        if(u == v) return false;
        if(-lab[u] < -lab[v]) swap(u, v);
        answer += save[u] + save[v];
        lab[u] += lab[v];
        lab[v] = u;
        save[u] = max(save[u], save[v]);
        return true;
    }
};

int main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0);

    if(fopen("SJEKIRA.INP", "r")) {
        freopen("SJEKIRA.INP", "r", stdin);
        freopen("SJEKIRA.OUT", "w", stdout);
    }

    cin >> n;

    for(int i = 1; i <= n; i++) {
        cin >> t[i];
    }

    for(int i = 1; i < n; i++) {
        int u, v; cin >> u >> v;
        adj[u].push_back(v);
        adj[v].push_back(u);
    }

    static int lab[N];
    for(int i = 1; i <= n; i++) {
        lab[i] = i;
    }

    sort(lab + 1, lab + 1 + n, [&](int x, int y) {
        return t[x] < t[y];
    });

    DisjointSet dsu(n + 3); dsu.load();
    for(int i = 1; i <= n; i++) {
        int u = lab[i];
        for(int v : adj[u]) if(vis[v]) {
            dsu.unite(u, v);
        }

        vis[u] = true;
    }

    cout << answer << endl;

    return 0;
}

Compilation message (stderr)

sjekira.cpp: In function 'int main()':
sjekira.cpp:45:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   45 |         freopen("SJEKIRA.INP", "r", stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~
sjekira.cpp:46:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   46 |         freopen("SJEKIRA.OUT", "w", stdout);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...