제출 #1369104

#제출 시각아이디문제언어결과실행 시간메모리
1369104absolut3Potatoes and fertilizers (LMIO19_bulves)C++20
100 / 100
308 ms47400 KiB
#pragma GCC optimize("O3")
#include <bits/stdc++.h>

using namespace std;

//#define int ll
#define ld long double
#define ll long long
#define ull unsigned ll
#define pb push_back
#define all(x) (x).begin(), (x).end()
#define sz(x) (int)(x.size())
#define pii pair < int, int >
#define pll pair < ll, ll >

#define debug(x) cerr << (#x) << " = " << (x) << endl

const int mod = 1e9 + 7;
const int N = 6e5+5;
const int B = 61;
const ll OO = 1e18;

template<typename T>
bool umn (T &fi, T se) { return fi > se ? (fi = se, 1) : 0; }

template<typename T>
bool umx (T &fi, T se) { return fi < se ? (fi = se, 1) : 0; }

void slv () {
    int n;
    cin >> n;

    multiset < ll > lp, rp;
    ll al = 0, ar = 0;
    ll pos = 0, val = 0, d = 0;
    for (int i = 0, x, y; i < n; ++i) {
        cin >> x >> y;
        if (!i) {
            --d;
            lp.insert(0);
            rp.insert(0);
        }
        if (i) {
            ll li = (sz(lp) ? *--lp.end() + al : -OO);
            ll ri = (sz(rp) ? *rp.begin() + ar : OO);
            ri = min(ri, ar);
//            cout << "i = " << i << " " << li << " " << ri << "\n";
            val += abs(pos);
            d--;
            if (0 < li) {
                lp.insert(0 - al);
                lp.insert(0 - al);
                lp.erase(--lp.end());
                rp.insert(li - ar);
            } else if (li <= 0 && 0 <= ri) {
                lp.insert(0 - al);
                rp.insert(0 - ar);
            } else {
                rp.insert(0 - ar);
                rp.insert(0 - ar);
                rp.erase(rp.begin());
                lp.insert(ri - al);
            }
        }
        int diff = x - y;
        if (diff < 0) {
            al += diff;
            ar += diff;
            pos += diff;
        } else {
            ar += diff;
        }
//        cout << pos << " " << val << "\n";
    }
//    cout << pos << " " << val << " " << d << "\n";
    for (ll p : lp) {
        p += al;
//        cout << p << " ";
        if (p > 0) p = 0;
        val += 1ll * (p - pos) * d;
        pos = p;
        ++d;
    }
//    cout << "\n";
    for (ll p : rp) {
        p += ar;
//        cout << p << " ";
        if (p > 0) p = 0;
        val += 1ll * (p - pos) * d;
        pos = p;
        ++d;
    }
//    cout << "\n";
    cout << val;
}

signed main () {
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    int test = 1;
//    cin >> test;
    while (test--) {
        slv();
        cout << "\n";
    }
}
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…