模板 - 数据结构 - 树状数组 / Binary Index Tree

这东西确实没有线段树方便用,经常要倒转区间。奈何速度过于惊人。

某一场CF上要求的二维偏序的问题,注意离散化的时候有时候要-1。

一定要注意树状数组的add中,传的不是n,而是离散化后坐标的xtop。

而且要注意在离散化的时候,unique后求元素的个数时用-(x+1),lower_bound求元素偏移时用-x。

int n;
int a[200005];
int b[200005];
int x[400005], xtop;
int bit[400005];
 
void add(int x, int v) {
    for(; x <= xtop; x += x & (-x))
        bit[x] += v;
}
 
ll sum(int x) {
    ll res = 0;
    for(; x; x -= x & (-x))
        res += bit[x];
    return res;
}
 
void test_case() {
    scanf("%d", &n);
    for(int i = 1; i <= n; ++i)
        scanf("%d", &a[i]);
    xtop = 0;
    for(int i = 1; i <= n; ++i) {
        scanf("%d", &b[i]);
        x[++xtop] = a[i] - b[i] - 1;
        x[++xtop] = b[i] - a[i];
    }
    sort(x + 1, x + 1 + xtop);
    xtop = unique(x + 1, x + 1 + xtop) - (x + 1);
    ll ans = 0;
    for(int i = 1; i <= n; ++i) {
        int pos1 = lower_bound(x + 1, x + 1 + xtop, a[i] - b[i] - 1) - x;
        ans += sum(pos1);
        int pos2 = lower_bound(x + 1, x + 1 + xtop, b[i] - a[i]) - x;
        add(pos2, 1);
    }
    printf("%lld\n", ans);
}
posted @ 2020-03-13 04:24  KisekiPurin2019  阅读(97)  评论(0编辑  收藏  举报