Submission #417053

#TimeUsernameProblemLanguageResultExecution timeMemory
417053balbitMeetings (IOI18_meetings)C++14
0 / 100
52 ms6732 KiB
#include "meetings.h"
#include <bits/stdc++.h>
using namespace std;

#define ll long long
#define int ll
#define pii pair<int, int>
#define pb push_back
#define f first
#define s second

#define REP(i,n) for (int i = 0; i<n; ++i)
#define REP1(i,n) for (int i = 1; i<=n; ++i)

#define ALL(x) (x).begin(), (x).end()
#define SZ(x) (int)(x).size()
#define MX(a,b) a = max(a,b)


#ifdef BALBIT
#define bug(...) cerr<<"#"<<__LINE__<<"- "<<#__VA_ARGS__<<": ", _do(__VA_ARGS__)
template<typename T> void _do(T && x) {cerr<<x<<endl;}
template<typename T, typename ...S> void _do(T && x, S && ...y) {cerr<<x<<", "; _do(y...);}
#else
#define bug(...)

#endif // BALBIT

const int maxn = 1e5+5;

ll dp[maxn]; //
vector<int> pos[21];

struct zsk{
    ll s[maxn*2];

    ll QU(int l, int r) {
        // range max query
        ll re = 0;
        for (l += maxn, r += maxn; l<r; l>>=1, r>>=1) {
            if (l&1) re = max(re, s[l++]);
            if (r&1) re = max(re, s[--r]);
        }
        return re;
    }

    void MO(int p, ll v) {
        p += maxn;
        for (s[p] = v; p>1; p>>=1) {
            s[p>>1] = max(s[p], s[p^1]);
        }
    }

    zsk(){
        memset(s, 0, sizeof s);
    }
};

ll L[maxn], R[maxn], H[maxn];
int n;
ll lval[maxn], rval[maxn];

zsk hseg;
zsk vseg;

ll getleft(int i, int lp) {
    int bg = hseg.QU(lp, i-1+1);
    if (bg == 0) return 0;
    int hi = *lower_bound(ALL(pos[bg]), lp); // last one in the range
    if (L[hi] >= lp) {
        return vseg.QU(lp, i-1) + (i-lp) * (ll)(H[i] - bg);
    }
    ll ret = vseg.QU(hi+1, i);
    MX(ret, max(getleft(hi, lp), rval[hi]));
    return ret + (i-lp) * (ll)(H[i] - bg);
}

ll getright(int i, int rp) {
    int bg = hseg.QU(i+1, rp+1);
    if (bg == 0) return 0;
    int hi = *prev(upper_bound(ALL(pos[bg]), rp)); // last one in the range
    if (R[hi] <= rp) {
        return vseg.QU(i+1, rp) + (rp-i) * (ll)(H[i] - bg);
    }
    ll ret = vseg.QU(i+1, hi);
    MX(ret, max(getright(hi, rp), lval[hi]));
    return ret + (rp-i) * (ll)(H[i] - bg);
}


std::vector<long long> minimum_costs(std::vector<signed> _H, std::vector<signed> QL,
                                     std::vector<signed> QR) {
    n = SZ(_H);
    H[0] = H[n+1] = 1000000001;
    vector<int> hei;
    hei.pb(0);
    REP1(i,n) {
        H[i] = _H[i-1];
        pos[H[i]].pb(i);
        while (H[hei.back()] < H[i]) {
            hei.pop_back();
        }
        L[i] = hei.back()+1;
        hei.pb(i);
    }
    REP(i, n+2) hseg.MO(i,H[i]);
    hei.clear(); hei.pb(n+1);
    for (int i = n; i>=1; --i) {
        while (H[hei.back()] < H[i]) {
            hei.pop_back();
        }
        R[i] = hei.back()-1;
        hei.pb(i);
    }
    REP1(i,n) {
        bug(i, L[i], R[i]);
    }
    for (int th = 1; th<=20; ++th) {
        // town hall? no. target height :D
        REP1(i,n) {
            if (H[i] == th) {
                lval[i] = getleft(i, L[i]);
                rval[i] = getright(i, R[i]);
                bug(i, lval[i], rval[i]);
                vseg.MO(i, max(lval[i], rval[i]));
            }
        }
    }

    vector<ll> ans(SZ(QL));

    REP(tat, SZ(QL)) {
        int ql = QL[tat], qr = QR[tat];
        ++ql; ++qr;
        int bg = hseg.QU(ql, qr+1);
        bug(bg);
        int a = *lower_bound(ALL(pos[bg]), ql);
        int b = *prev(upper_bound(ALL(pos[bg]), qr));
        bug(bg, a,b);
        ll ret = vseg.QU(a+1, b);

        MX(ret, getleft(a, ql));
        MX(ret, getright(b, qr));

        ans[tat] = (qr-ql+1) * bg - ret;
    }

    return ans;

}


/*
4 3
2 4 3 5
0 2
1 3
0 3
*/
#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...