ural 1028. Stars 树状数组

/*

 

题目:

    星星有等级,每颗星星的等级划分为在它下方(坐标轴上)有多少颗星星即为多少等级

 

分析:

    由于先输入的是x坐标,而y坐标已经是按照由小到大输入的,所以可以用树状数组来求和的形式

    来求出该行星的等级。

 

*/

#include <iostream>

#include <cstdio>

#include <cstring>

using namespace std;

#define X 40005

int c[X],ans[X],n;

int lowbit(int x){

    return x & -x;

}

void modify(int x){

    while(x<X){

        c[x]++;

        x += lowbit(x);

    }

}

int sum(int x){

    int cnt = 0;

    while(x>0){

        cnt += c[x];

        x -= lowbit(x);

    }

    return cnt;

}

int main(){

    freopen("sum.in","r",stdin);

    freopen("sum.out","w",stdout);

    int x,y;

    cin>>n;

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

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

    for(int i=0;i<n;i++){

        scanf("%d%d",&x,&y);

        x++;

        modify(x);

        ans[sum(x)-1]++;

    }

    for(int i=0;i<n;i++)

        printf("%d\n",ans[i]);

    return 0;

}

你可能感兴趣的:(树状数组)