- 玄关求调
营业额统计
- @ 2025-8-21 16:08:41
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 条评论
目前还没有评论...