Submission #1294724

#TimeUsernameProblemLanguageResultExecution timeMemory
1294724dooweySafety (NOI18_safety)C++20
100 / 100
132 ms19192 KiB
#include <bits/stdc++.h>

using namespace std;

typedef long long ll;

#define fastIO ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);

struct MySet{
    ll b = 0;
    multiset<ll> si;
    void inc(ll x){
        b += x;
    }

    void ins(ll x){
        si.insert(x-b);
    }
    ll get_max(){
        auto it = si.end();
        --it;
        return *it+b;
    }
    ll get_min(){
        auto it = si.begin();
        return *it+b;
    }

    void pop_max(){
        auto it = si.end();
        --it;
        si.erase(it);
    }

    void pop_min(){
        auto it = si.begin();
        si.erase(it);
    }
};

int main(){
    fastIO;
    int n;
    ll h;
    cin >> n >> h;
    ll x;
    MySet L, R;
    ll res = 0;
    for(int i = 1; i <= n; i ++ ){
        cin >> x;
        L.inc(-h);
        R.inc(h);
        if(i > 1){
            ll lf = L.get_max();
            ll rf = R.get_min();
            if(x < lf)
                res += lf - x;
            else if(x > rf)
                res += x - rf;
        }
        L.ins(x);
        R.ins(x);
        while(L.get_max() > R.get_min()){
            ll pi = L.get_max();
            ll qi = R.get_min();
            L.pop_max();
            R.pop_min();
            R.ins(pi);
            L.ins(qi);
        }
    }
    cout << res << "\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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...