Submission #1356656

#TimeUsernameProblemLanguageResultExecution timeMemory
1356656Desh03Road Closures (APIO21_roads)C++20
0 / 100
49 ms12812 KiB
#include <bits/stdc++.h>

using namespace std;

vector<long long> minimum_closure_costs(int n, vector<int> u, vector<int> v, vector<int> w) {
    set<pair<int, int>> e1, e2;
    vector<int> d(n);
    for (int i = 0; i + 1 < n; i++) {
        ++d[u[i]];
        ++d[v[i]];
    }
    for (int i = 0; i + 1 < n; i++) {
        e1.insert({min(d[u[i]], d[v[i]]), i});
        e2.insert({max(d[u[i]], d[v[i]]), i});
    }
    vector<long long> ans(n);
    for (int k = n - 1; k >= 0; k--) {
        if (k < n - 1) ans[k] = ans[k + 1];
        while (e1.size()) {
            auto [x, y] = *e1.rbegin();
            x = min(d[u[y]], d[v[y]]);
            if (x <= k) break;
            e1.erase(--e1.end());
            e2.erase({max(d[u[y]], d[v[y]]), y});
            --d[u[y]];
            --d[v[y]];
            ++ans[k];
            if (d[u[y]] && d[v[y]]) e1.insert({min(d[u[y]], d[v[y]]), y});
            if (d[u[y]] && d[v[y]]) e2.insert({max(d[u[y]], d[v[y]]), y});
        }
        while (e2.size()) {
            auto [x, y] = *e2.rbegin();
            x = max(d[u[y]], d[v[y]]);
            if (x <= k) break;
            e2.erase(--e2.end());
            e1.erase({min(d[u[y]], d[v[y]]), y});
            --d[u[y]];
            --d[v[y]];
            ++ans[k];
            if (d[u[y]] && d[v[y]]) e1.insert({min(d[u[y]], d[v[y]]), y});
            if (d[u[y]] && d[v[y]]) e2.insert({max(d[u[y]], d[v[y]]), y});
        }
    }
    return ans;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...