题目链接: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]); } }