Submission #1244345

#TimeUsernameProblemLanguageResultExecution timeMemory
1244345riddlesNile (IOI24_nile)C++20
Compilation error
0 ms0 KiB
#include "nile.h"
#include <bits/stdc++/h>
using namespace std;

struct DSU {
    vector<int> parent, size;
    vector<int> even, odd;
    long long cost = 0;

    DSU(vector<int> &A, vector<int> &B) : parent(A.size(), -1), size(A.size(), 1), even(A.size()), odd(A.size(), INT_MAX) {
        for (int i = 0; i < A.size(); i++) {
            even[i] = A[i] - B[i];
            cost += even[i];
        }
    }
    int get_par(int x) {
        return ~parent[x] ? parent[x] = get_par(parent[x]) : x;
    }
    void merge(int v) {
        int u = get_par(v - 1);
        for (int x : {u, v})
            if (size[x] & 1)
                cost -= even[x];

        if (size[u] & 1)
            swap(even[v], odd[v]);
        odd[u] = min(odd[u], odd[v]);
        even[u] = min(even[u], even[v]);

        parent[v] = u;
        size[u] += size[v];
        if (size[u] & 1)
            cost += even[u];
    }
    void consider(int v, int w) {
        int u = get_par(v);
        if (v - u & 1) {
            if (size[u] & 1)
                cost -= even[u];
            even[u] = min(even[u], w);
            if (size[u] & 1)
                cost += even[u];
        }
        else
            odd[u] = min(odd[u], w);
    }
};

vector<long long> calculate_costs(vector<int> W, vector<int> A, vector<int> B, vector<int> E) {
    int n = W.size(), q = E.size();
    if (n == 1)
        return vector<long long>(q, A[0]);

    vector<tuple<int, int, int>> helper;
    for (int i = 0; i < n; i++)
        helper.push_back({W[i], A[i], B[i]});
    sort(helper.begin(), helper.end());
    for (int i = 0; i < n; i++)
        tie(W[i], A[i], B[i]) = helper[i];

    vector<int> diff1(n - 1);
    iota(diff1.begin(), diff1.end(), 1);
    sort(diff1.begin(), diff1.end(), [&](int i, int j) {
        return W[i] - W[i - 1] < W[j] - W[j - 1];
    });

    vector<int> diff2(n - 2);
    iota(diff2.begin(), diff2.end(), 1);
    sort(diff2.begin(), diff2.end(), [&](int i, int j) {
        return W[i + 1] - W[i - 1] < W[j + 1] - W[j - 1];
    });

    vector<int> indexes(q);
    iota(indexes.begin(), indexes.end(), 0);
    sort(indexes.begin(), indexes.end(), [&](int i, int j) {
        return E[i] < E[j];
    });

    DSU dsu(A, B);
    int p1 = 0, p2 = 0;
    vector<long long> costs(q);
    long long total = accumulate(B.begin(), B.end(), 0LL);
    for (int index : indexes) {
        while (p1 < n - 1 && W[diff1[p1]] - W[diff1[p1] - 1] <= E[index]) {
            int idx = diff1[p1++];
            dsu.merge(idx);

            for (int p : {idx, idx - 1})
                if (p && p < n - 1 && W[p + 1] - W[p - 1] <= E[index] && dsu.get_par(p + 1) == dsu.get_par(p - 1))
                    dsu.consider(p, A[p] - B[p]);
        }
        while (p2 < n - 2 && W[diff2[p2] + 1] - W[diff2[p2] - 1] <= E[index]) {
            int idx = diff2[p2++];
            if (dsu.get_par(idx + 1) == dsu.get_par(idx - 1))
                dsu.consider(idx, A[idx] - B[idx]);
        }
        costs[index] = total + dsu.cost;
    }

    return costs;
}

Compilation message (stderr)

nile.cpp:2:10: fatal error: bits/stdc++/h: No such file or directory
    2 | #include <bits/stdc++/h>
      |          ^~~~~~~~~~~~~~~
compilation terminated.