看树状数组课件的时候见到过 这个题,给出恒星的坐标,Y轴从小到大有序,那么按y轴的顺序修改树状数组的值,求1-x的区间和就是在恒星左下的恒星数。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <map>
#include <set>
using namespace std;
const int maxn=15010;
const int maxm=32010;
int num[maxn],x[maxn];
int c[maxm],my;
int lowbit(int k)
{
return k&(-k);
}
int query(int k)
{
int sum=0;
while(k>0)
{
sum+=c[k];
k-=lowbit(k);
}
return sum;
}
void update(int k)
{
while(k<=my)
{
c[k]+=1;
k+=lowbit(k);
}
}
int main()
{
//freopen("data","r",stdin);
int y,n;
while(~scanf("%d",&n))
{
memset(num,0,sizeof(num));
memset(c,0,sizeof(c));
my=0;
for(int i=0;i<n;i++)
{
scanf("%d%d",&x[i],&y);
if(x[i]>my)
my=x[i];
}
my++;
for(int i=0;i<n;i++)
{
//cout<<query(x)<<endl;
num[query(x[i]+1)]++;
update(x[i]+1);
}
for(int i=0;i<n;i++)
{
printf("%d\n",num[i]);
}
}
return 0;
}