POJ 2481 - Cows 树状数组

树状数组

作用

O(logN)的复杂度计算数组A[]从1到N项和。

优点

在线数据结构,复杂度低。

复杂度 

修改A[N] -> O(logN)

计算∑A[1..N] -> O(logN)

模板

struct BIT{         //Binary Indexed Tree
    int Tree[MAXS + 10], size;
    #define lowbit(i) (i&(-i))
    BIT(){}
    BIT(int SIZE): size(SIZE){
        memset(Tree + 1, 0, SIZE * sizeof(int));
    }
    void add(int i, int det){
        for (; i <= size; i += lowbit(i))
            Tree[i] += det;
    }
    int sum(int i){
        int res = 0;
        for (; i > 0; i -= lowbit(i))
            res += Tree[i];
        return res;
    }
    #undef lowbit
};

 辛酸的血泪史

//POJ 2481
//树状数组
//把10^5当成10000调了一个下午加半个晚上
//再见世界
//AC 2016-10-16

#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#include <cstring>
#define MAXN 100000
#define MAXS 100000
using namespace std;

struct cow{
    int s, e, tag;
    friend bool operator < (const cow &c1, const cow &c2){
        return (c1.e > c2.e) || (c1.e == c2.e) && (c1.s < c2.s);
    }
}cows[MAXN + 10];

struct BIT{
    int Tree[MAXS + 10], size;
    void resize(int SIZE){
        size = SIZE;
        memset(Tree + 1, 0, SIZE * sizeof(int));
    }
    inline int lowbit(int x){
        return x&-x;
    }
    void inc(int i){
        for (; i <= size; i += lowbit(i))
            Tree[i]++;
    }
    int sum(int i){
        int res = 0;
        for (; i > 0; i -= lowbit(i))
            res += Tree[i];
        return res;
    }
}stronger;

int ans[MAXN + 10];

int main(){
    int n;
    freopen("fin.c", "r", stdin);
    while (scanf("%d", &n), n){
        int top = 0;
        for (int i = 1; i <= n; i++){
            scanf("%d%d", &cows[i].s, &cows[i].e);
            cows[i].s++, cows[i].e++;
            cows[i].tag = i;
            if (top < cows[i].s) top = cows[i].s;
        }
        stronger.resize(top);
        sort(cows + 1, cows + n + 1);
        for (int i = 1; i <= n; i++){
            if ((i - 1)&&(cows[i].e == cows[i - 1].e)&&(cows[i].s == cows[i - 1].s))
                ans[cows[i].tag] = ans[cows[i - 1].tag];
            else
                ans[cows[i].tag] = stronger.sum(cows[i].s);
            stronger.inc(cows[i].s);
        }
        printf("%d", ans[1]);
        for (int i = 2; i <= n; i++)
            printf(" %d", ans[i]);
        puts("");
    }
    return 0;
}

 

posted on 2016-10-16 19:55  xlnx  阅读(145)  评论(0)    收藏  举报

导航