Submission #1160259

#TimeUsernameProblemLanguageResultExecution timeMemory
1160259JahonaliXNile (IOI24_nile)C++20
100 / 100
120 ms21188 KiB
#include <bits/stdc++.h>

using namespace std;

using ll = long long;

struct dsu {
    int n;
    vector<int> p, l;
    vector<ll> t, j, f;
    ll x = 0;
    dsu(vector<ll> &a) {
        n = a.size();
        p.assign(n, 0);
        l.assign(n, 1);
        t = a;
        x = accumulate(a.begin(), a.end(), 0ll);
        j.assign(n, INT_MAX);
        f.assign(n, INT_MAX);
        iota(p.begin(), p.end(), 0);
    }
    int find(int x) {
        if (x == p[x]) return x;
        return p[x] = find(p[x]);
    }
    void merge(int a, int b) {
        if (a > b) swap(a, b);
        a = find(a);
        b = find(b);
        x -= l[a] % 2 * min(t[a], f[a]);
        x -= l[b] % 2 * min(t[b], f[b]);
        if (l[a] % 2) t[a] = min(t[a], j[b]), j[a] = min(j[a], t[b]);
        else t[a] = min(t[a], t[b]), j[a] = min(j[a], j[b]);
        f[a] = min(f[a], f[b]);
        p[b] = a;
        l[a] += l[b];
        x += l[a] % 2 * min(t[a], f[a]);
    }
};

vector<long long> calculate_costs(vector<int> W, vector<int> A, vector<int> B, vector<int> E) {
    vector<long long> ans;
    int q = (int) E.size(), n = (int) W.size();
    for (int i = 0; i < n; ++i) A[i] -= B[i];
    vector<int> o(n);
    iota(o.begin(), o.end(), 0);
    sort(o.begin(), o.end(), [&](int i, int j) { return W[i] < W[j]; });
    vector<ll> w(n), a(n), b(n);
    for (int i = 0; i < n; ++i) w[i] = W[o[i]], a[i] = A[o[i]], b[i] = B[o[i]];    
    set<pair<int, int>> s;
    set<tuple<ll, ll, ll>> c;
    for (int i = 1; i < n; ++i) s.emplace(w[i] - w[i - 1], i);
    for (int i = 2; i < n; ++i) c.emplace(w[i] - w[i - 2], a[i - 1], i - 1);
    o.assign(q, 0);
    iota(o.begin(), o.end(), 0);
    sort(o.begin(), o.end(), [&](int i, int j) { return E[i] < E[j]; });
    dsu d(a);
    ans.assign(q, 0);
    ll wth = 0;
    for (int i : b) wth += i;
    for (int i = 0; i < q; ++i) {
        int e = E[o[i]];
        while (s.size() && (*s.begin()).first <= e) {
            int x = (*s.begin()).second;
            d.merge(x, x - 1);
            s.erase(s.begin());
        } 
        while (c.size() && get<0>(*c.begin()) <= e) {
            auto [x, y, z] = *c.begin();
            c.erase(c.begin());
            z = d.find(z);
            d.x -= d.l[z] % 2 * min(d.t[z], d.f[z]);
            d.f[z] = min(d.f[z], y);
            d.x += d.l[z] % 2 * min(d.t[z], d.f[z]);
        }
        ans[o[i]] = d.x + wth;
    }
    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...
#Verdict Execution timeMemoryGrader output
Fetching results...