点我看题目

题意 : 给你若干个星星,然后给出你每个星星的坐标(按照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

 

posted on 2014-02-19 20:29  枫、  阅读(150)  评论(0编辑  收藏  举报