Submission #1358125

#TimeUsernameProblemLanguageResultExecution timeMemory
1358125Desh03Palembang Bridges (APIO15_bridge)C++17
78 / 100
84 ms10376 KiB
#include <bits/stdc++.h>

using namespace std;

template<typename T>
struct Fenwick {
    vector<T> f;
    int n;
    Fenwick(int n) : n(n) {
        f.resize(n);
    }
    void upd1(int i, T x) {
        while (i >= 0) {
            f[i] += x;
            i = (i & i + 1) - 1;
        }
    }
    void upd2(int i, T x) {
        while (i < n) {
            f[i] += x;
            i |= i + 1;
        }
    }
    T qry1(int i) {
        T s{};
        while (i < n) {
            s += f[i];
            i |= i + 1;
        }
        return s;
    }
    T qry2(int i) {
        T s{};
        while (i >= 0) {
            s += f[i];
            i = (i & i + 1) - 1;
        }
        return s;
    }
};

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    int k, n;
    cin >> k >> n;
    vector<tuple<int, int, int>> v;
    long long ans = 0;
    vector<int> pts;
    for (int i = 0; i < n; i++) {
        char p, q;
        int s, t;
        cin >> p >> s >> q >> t;
        ans += abs(s - t);
        if (p != q) {
            v.push_back({s + t, min(s, t), max(s, t)});
            ans++;
            pts.push_back(s);
            pts.push_back(t);
        }
    }
    if (v.empty()) {
        cout << ans << '\n';
        return 0;
    }
    sort(v.begin(), v.end());
    sort(pts.begin(), pts.end());
    pts.erase(unique(pts.begin(), pts.end()), pts.end());
    int z = v.size(), x = pts.size();
    vector<long long> l(z + 1), r(z + 2);
    Fenwick<long long> f1(x), f3(x);
    Fenwick<int> f2(x), f4(x);
    auto eval = [&](int i) {
        return f1.qry1(i) - (long long) pts[i] * f2.qry1(i) + (long long) pts[i] * f4.qry2(i) - f3.qry2(i);
    };
    for (int i = 0, j = 0; i < z; i++) {
        auto &[u, s, t] = v[i];
        s = lower_bound(pts.begin(), pts.end(), s) - pts.begin();
        t = lower_bound(pts.begin(), pts.end(), t) - pts.begin();
        f1.upd1(s, pts[s]);
        f2.upd1(s, 1);
        f3.upd2(t, pts[t]);
        f4.upd2(t, 1);
        while (j + 1 < x && eval(j) >= eval(j + 1)) {
            ++j;
        }
        l[i + 1] = eval(j);
    }
    if (k == 1) {
        cout << ans + l[z] * 2 << '\n';
        return 0;
    }
    f1 = f3 = Fenwick<long long> (x);
    f2 = f4 = Fenwick<int> (x);
    for (int i = z - 1, j = x - 1; i >= 0; i--) {
        auto [u, s, t] = v[i];
        f1.upd1(s, pts[s]);
        f2.upd1(s, 1);
        f3.upd2(t, pts[t]);
        f4.upd2(t, 1);
        while (j && eval(j) >= eval(j - 1)) {
            --j;
        }
        r[i + 1] = eval(j);
    }
    long long mn = 1e18;
    for (int i = 0; i <= z; i++) {
        mn = min(mn, l[i] + r[i + 1]);
    }
    cout << ans + mn * 2 << '\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...
#Verdict Execution timeMemoryGrader output
Fetching results...