用了树状数组->
但是因为是cb不会改,就加了个二分,但是似乎哪里出了问题
#include <iostream>
#include <cstdio>
using namespace std;
int n;
short t[6000001];
long long lowbit(long long x) {
return x & (-x);
}
void insert(long long x) {
for(long long i = x;i <= 6000000;i += lowbit(i)) {
t[i]++;
}
}
long long getsum(long long x) {
long long sum = 0;
for(long long i = x;i;i -= lowbit(i)) {
sum += t[i];
}
return sum;
}
int main() {
long long SUM = 0;
scanf("%d", &n);
for(int i = 1;i <= n;i++) {
long long d;
scanf("%lld", &d);
d += 3000000;
insert(d);
if(i == 1) {
SUM += d - 3000000;
continue;
}
if(getsum(d) - getsum(d - 1) > 1) {
continue;
}
long long ll = 1, lr = d - 1, rl = d + 1, rr = 6000000;
while(lr - ll > 20 && rr - rl > 20) {
long long lm = (ll + lr) / 2, rm = (rl + rr) / 2;
long long ls = getsum(lr) - getsum(lm - 1);
long long rs = getsum(rm) - getsum(rl - 1);
if(ls == 0 && rs == 0) {
lr = lm - 1;
rl = rm + 1;
} else {
ll = lm;
rr = rm;
}
}
long long ans = 6000000;
for(int i = 0;lr - i >= ll && d - lr + i <= ans;i++) {
if(getsum(lr - i) - getsum(lr - i - 1) > 0) {
ans = min(ans, d - lr + i);
}
}
for(int i = 0;rl + i <= rr && rl - d + i <= ans;i++) {
if(getsum(rl + i) - getsum(rl + i - 1) > 0) {
ans = min(ans, rl - d + i);
}
}
SUM += ans;
}
printf("%lld", SUM);
return 0;
}