POJ 2352 Stars(树状数组)

点我看题目

题意 : 给你若干个星星,然后给出你每个星星的坐标(按照y递增的顺序给出,若是y相同就按照x递增的顺序给出),定义所谓的星星级别为横纵坐标不超过自己的星星的个数。问级别0到n-1的星星各有多少个。

思路 :因为当前的星星与后面的星星没有关系,所以只要把x之前的横坐标加起来就行,树状数组模板题,但是树状数组下标是从1开始的,所以x要加1。

#include <iostream>

#include <stdio.h>

#include <string.h>



using namespace std;



const int maxn = 100000 ;

int tree[maxn+10] ;//树状数组

inline int lowbit(int x)//lowbit(i)表示i最低的二进制位

{

    return(x&(-x)) ;

}

void add(int x)

{

    for(int i = x ; i <= maxn ; i += lowbit(i) )

    {

        tree[i] += 1 ;

    }

}

int get(int x)

{

    int sum = 0 ;

    for(int i = x ; i ; i -= lowbit(i))

    {

        sum += tree[i] ;

    }

    return sum ;

}

int main()

{

    int n ;

    int ans[maxn] ;//保存等级

    while(scanf("%d",&n)!=EOF)

    {

        int x,y ;

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

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

        {

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

            x++ ;y++ ;

            ans[get(x)]++ ;

            add(x) ;

        }

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

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

    }

    return 0;

}
View Code

 

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