不明原因WA70
查看原帖
不明原因WA70
47425
clarkwang楼主2022/10/29 12:46

用了树状数组->
但是因为是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;
}
2022/10/29 12:46
加载中...