cpp
// 营业额统计
#include <iostream>
#include <cstdlib>
#define lc son[p][0]
#define rc son[p][1]
#define inf 0x3f3f3f3f

using namespace std;

const int N = 32800;
int n, arr[N], root, idx;
int son[N][2], val[N], siz[N], pri[N];

void up(int p) { siz[p] = siz[lc] + siz[rc]; }

void split(int p, int v, int &l, int &r) {
    if (!p) {
        l = r = 0;
        return;
    }
    if (val[p] <= v) {
        l = p;
        split(rc, v, rc, r);
    } else {
        r = p;
        split(lc, v, l, lc);
    }
}


int merge(int l, int r) {
    if (!l || !r) return l + r;
    if (pri[l] > pri[r]) {
        son[l][1] = merge(son[l][1], r);
        up(l);
        return l;
    } else {
        son[r][0] = merge(l, son[r][0]);
        up(r);
        return r;
    }
}

void insert(int v) {
    int p = ++idx, l, r;
    split(root, v, l, r);
    val[p] = v;
    siz[p] = 1;
    pri[p] = rand();
    root = merge(merge(l, p), r);
}

int kth(int p, int v) {
    if (!p) return 0;
    if(siz[lc] >= v) return kth(lc, v);
    if(siz[lc] + 1 == v) return val[p];
    return kth(rc, v - siz[lc] - 1);
}

int getpre(int v) {
    int l, r;
    split(root, v, l, r);
    int res = kth(l, siz[l]);
    root = merge(l, r);
    return res;
}

int getnext(int v) {
    int l, r;
    split(root, v + 1, l, r);
    int res = kth(r, 1);
    root = merge(l, r);
    return res;
}

int main(void)
{
    cin >> n >> arr[0];
    int ans = arr[0];
    insert(arr[0]);
    for (int i = 1; i < n; i++) {
        cin >> arr[i];
        ans += min(arr[i] - getpre(arr[i]), getnext(arr[i]) - arr[i]);
		insert(arr[i]);
    }
    cout << ans;
    return 0;
}

0 条评论

目前还没有评论...