POJ 2352 Stars(树状数组)

题目链接:http://poj.org/problem?id=2352

题目大意:给出按照Y坐标升序(如果Y坐标相同,按X坐标升序)的星星坐标,统计它的左下星星数量(左下星星数量表示X0<=X,Y0<=Y的星星),左下星星数量N就表示这个星星是第N级星星,输出各级星星的数量。

思路:因为是按照Y坐标升序输入的,所以之前输入所有X坐标比当前星星X坐标小的星星都是该星星的左下星星,我们使用树状数组来维护比当前X小的所有星星的数量。

#include<iostream>
#include<stdio.h>
#include<cstring> 
using namespace std;
#define MAXN 100050
typedef long long ll;
#define MEM(x) memset(x,0,sizeof(x))
ll tree[MAXN],ans[MAXN];
ll m;
ll lowbit(ll k){ //取位 
    return k&-k;
}

void add(ll k,ll num){//更新 
    for(ll i=k;i<=MAXN;i+=lowbit(i)) tree[i]+=num;
}

ll getsum(ll k){ //区间求和 
    ll ans=0;
    for(ll i=k;i>0;i-=lowbit(i)) ans+=tree[i];
    return ans;
}

int main(){
    ll i,x,y;
    while(~scanf("%lld",&m)){
        MEM(tree);
        MEM(ans);
        for(i=0;i<m;i++){
            scanf("%lld%lld",&x,&y);
            ans[getsum(x)]++;
            add(x,1);
        }
        for(i=0;i<m;i++) printf("%lld
",ans[i]);
    }
    
} 
原文地址:https://www.cnblogs.com/feijimoyan/p/7896202.html