HDU 1541 树状数组

传送门:HDU 1541

题意

 给定一组点,用坐标表示,求各个层次的点的数量, 每个点层次指的是其它点中x,y坐标均不大于当前点x,y坐标点的数量


题解:

注意题目给出, 所有输入对于y来说都是不降序, 所以只要考虑x就可以了, y不增的时候x自增, 所以后输入的点不会影响先输入点的层次
 因为计算层次的时候要排除自身, 所以要先更新当前点的层次再更新树状数组


AC code:

#include
#include
#include
using namespace std;

#define lowbit(x) (x & (-x))
#define LL long long 
#define debug 0

const int maxn(500005);

int ans[15003], c[32003];

int n;



void add(int id, int v) {//更新树状数组

    while (id <= 32000) {
        c[id] += v;
        id += lowbit(id);
    }
}

int getSum(int id) {//当前点的层次
    int res = 0;

    while (id) {
        res +=c[id];
        id -= lowbit(id);
    }

    return res;
}

int main() {
#if debug
    freopen("in.txt", "r", stdin);
#endif //debug

    int x, y;

    while (cin >> n) {

        memset(c, 0, sizeof(c));
        memset(ans, 0, sizeof(ans));

        for (int i = 1; i <= n; ++i) {
            cin >> x >> y;
            ++x;//lowbit 用0会TLE
            ans[getSum(x)]++;
            add(x, 1);
        }


        for (int i = 0; i < n; i++) {
            cout << ans[i] << endl;
        }
    }

    return 0;
}

你可能感兴趣的:(HDU,数据结构-树状数组)