Submission #746228

#TimeUsernameProblemLanguageResultExecution timeMemory
746228SebSafety (NOI18_safety)C++17
100 / 100
78 ms5476 KiB
#include <bits/stdc++.h>

using namespace std;

typedef long long ll;

struct F{
    ll m,b,izq,der;
    priority_queue <ll> pq1;
    priority_queue <ll,vector<ll>,greater<ll>> pq2;
    F(ll M, ll B, vector <ll> V) {
        m = M;
        b = B;
        izq = 0;
        der = 0;
        if (!V.empty()) {
            pq1.push(V[0]);
            pq2.push(V[1]);
        }
    }
    void unir(F a) {
        m += a.m;
        b += a.b;
        if (pq1.top()+izq >= a.pq1.top()) {
            while (!a.pq1.empty()) {
                pq1.push(a.pq1.top()-izq);
                a.pq1.pop();
            }
            while (!a.pq2.empty()) {
                pq1.push(a.pq2.top()-izq);
                a.pq2.pop();
            }
        }
        else if (pq2.top()+der <= a.pq2.top()) {
            while (!a.pq1.empty()) {
                pq2.push(a.pq1.top()-der);
                a.pq1.pop();
            }
            while (!a.pq2.empty()) {
                pq2.push(a.pq2.top()-der);
                a.pq2.pop();
            }
        }
        else {
            while (!a.pq1.empty()) {
                pq1.push(a.pq1.top()-izq);
                a.pq1.pop();
            }
            while (!a.pq2.empty()) {
                pq2.push(a.pq2.top()-der);
                a.pq2.pop();
            }
        }
        return;
    }
    void act(ll h) {
        if (m==1) {
            m--;
            b += (pq1.top()+izq);
            pq2.push(pq1.top()+izq-der);
            pq1.pop();
        }
        else if (m==-1) {
            m++;
            b -= (pq2.top()+der);
            pq1.push(pq2.top()+der-izq);
            pq2.pop();
        }
        izq -= h;
        der += h;
        return;
    }
};

int main() {
ios_base::sync_with_stdio(0);cin.tie(0);
ll n,h,aux;
cin>>n>>h;
F f = F(0,0,{});
for (int i=0;i<n;i++) {
    cin>>aux;
    if (!f.pq1.empty() && !f.pq2.empty()) {
        if (f.pq1.top()+f.izq >= aux) f.unir(F(1,-aux,{aux,aux}));
        else if (f.pq2.top()+f.der <= aux) f.unir(F(-1,aux,{aux,aux}));
        else f.unir(F(0,0,{aux,aux}));
    }
    else f = F(0,0,{aux,aux});
    f.act(h);
}
cout<<f.b;
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...