Submission #851294

#TimeUsernameProblemLanguageResultExecution timeMemory
851294yangjlPotatoes and fertilizers (LMIO19_bulves)C++17
100 / 100
125 ms20284 KiB
#include<iostream>
#include<cmath>
#include<cstring>
#include<cassert>
#include<string>
#include<queue>
#include<deque>
#include<stack>
#include<algorithm>
#include<unordered_map>
#include<map>
#include<vector>
#include<set>
#include<unordered_set>
#include<bitset>
#include<climits>
#include<numeric>
#include<functional>
#include<iomanip>
#ifdef YJL
#include<debug.h>
#else
#define debug(args...)0
#define debug_n(a,n)0
#endif
#define ALL(a) a.begin(),a.end()
using namespace std;
using ll=long long;

constexpr ll inf = numeric_limits<ll>::max()/2;
struct slope_trick_concave {// 凹折线函数
    priority_queue<ll> ql;
    priority_queue<ll,vector<ll>,greater<>> qr;
    ll tagl,tagr;// 左右堆中斜率改变点的懒标记
    ll height;// 最低点高度
    slope_trick_concave(): tagl(0), tagr(0), height(0) {
        ql.push(-inf);
        qr.push(inf);
    }
    ll get_left() {
        return ql.top()+tagl;
    }
    ll get_right() {
        return qr.top()+tagr;
    }
    // f(x) = g(x) + |x-c|
    void add(ll c) {
        ll xl=get_left();
        ll xr=get_right();
        if(xl <= c && c <= xr) {
            ql.push(c-tagl);
            qr.push(c-tagr);
        }else if(c < xl) {
            height+=xl-c;
            qr.push(xl-tagr);
            ql.pop();
            ql.push(c-tagl);
            ql.push(c-tagl);
        }else {
            height+=c-xr;
            ql.push(xr-tagl);
            qr.pop();
            qr.push(c-tagr);
            qr.push(c-tagr);
        }
    }
    // g(x) = min_{y=x+low, x+high} f(y)
    void range_min(ll low, ll high) {
        tagl-=high;
        tagr-=low;
    }
    // g(x) = min_{y=-inf, x} f(y)
    void pref_min() {
        tagr=0;
        while(qr.size()>1)
            qr.pop();
    }
};

int main() {
    ios::sync_with_stdio(0), cin.tie(0);
    int n;
    cin>>n;
    vector<ll> a(n),b(n);
    for(int i=0; i<n; ++i) {
        cin>>a[i];
         cin>>b[i];
        a[i]-=b[i];
        if(i) a[i]+=a[i-1];
    }
    // for(int i=0; i<n; ++i) {
       
    // }

    slope_trick_concave sp;
    ll ans=0;
    for(int i=0; i<n; ++i) {
        if(a[i]<0) {
            ans-=a[i];
            a[i]=0;
        }
        if(a[i]>a[n-1]) {
            ans+=a[i]-a[n-1];
            a[i]=a[n-1];
        }
        sp.add(a[i]);
        sp.pref_min();
    }
    cout<<ans+sp.height;
    return 0;
}
/*
a[i]++, a[i+1]--
前缀和
a[i]++

最后
0<=a[0]<=..<=a[n-1]
*/
#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...