Submission #1218040

#TimeUsernameProblemLanguageResultExecution timeMemory
1218040Double_SlashBulldozer (JOI17_bulldozer)C++20
75 / 100
506 ms33612 KiB
#include <bits/stdc++.h>

using namespace std;
using ll = long long;
#define all(x) x.begin(), x.end()
using pint = pair<int, int>;

struct Val {
    ll sum, lmx, rmx, mx;

    void operator=(int x) { lmx = rmx = mx = max(sum = x, 0ll); }

    Val operator+(const Val &o) const {
        Val ret{sum + o.sum, max(lmx, sum + o.lmx), max(rmx + o.sum, o.rmx)};
        ret.mx = max({mx, o.mx, ret.lmx, ret.rmx, rmx + o.lmx});
        return ret;
    }
};

struct St {
    int n;
    vector<Val> st;

    St(int n) : n(n), st(n << 1) {}

    void update(int i, int v) {
        for (st[i += n] = v; i >>= 1;) st[i] = st[i << 1] + st[i << 1 | 1];
    }

    ll query(int l, int r) {
        Val lagg{}, ragg{};
        for (l += n, r += n; l < r; l >>= 1, r >>= 1) {
            if (l & 1) lagg = lagg + st[l++];
            if (r & 1) ragg = st[--r] + ragg;
        }
        return (lagg + ragg).mx;
    }
};

pint operator-(const pint &a, const pint &b) { return {a.first - b.first, a.second - b.second}; }

ll operator^(const pint &a, const pint &b) { return (ll) a.first * b.second - (ll) b.first * a.second; }

int main() {
    int n;
    cin >> n;
    pint p[n];
    int w[n];
    for (int i = n; i--;) cin >> p[i].first >> p[i].second >> w[i];
    int arr[n];
    iota(arr, arr + n, 0);
    sort(arr, arr + n, [&] (int i, int j) { return p[i] < p[j]; });
    St st(n);
    int idx[n];
    for (int i = n; i--;) st.update(idx[arr[i]] = i, w[arr[i]]);
    vector<pair<pint, pint>> swaps;
    for (int i = n; i--;) {
        for (int j = n; j--;) {
            pint v = p[i] - p[j];
            if (v > pint{0, 0}) swaps.emplace_back(v, pint{i, j});
        }
    }
    sort(all(swaps), [&] (auto &a, auto &b) { return (a.first ^ b.first) < 0; });
    ll ans = st.query(0, n);
    for (int i = 0; i < swaps.size(); ++i) {
        auto [a, b] = swaps[i].second;
        if (idx[a] > idx[b]) {
            swap(idx[a], idx[b]);
            st.update(idx[a], w[a]);
            st.update(idx[b], w[b]);
        }
        if (i + 1 == swaps.size() or (swaps[i].first ^ swaps[i + 1].first)) ans = max(ans, st.query(0, n));
    }
    cout << 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...