//125ms
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
int c[32005],ans[15005],n,ma;
int data[15005];
int low(int t)
{
return t&(-t);
}
void update(int i,int val)
{
while(i<=ma+1)//一开始写的是i<=ma结果WA了,因为整体数据data[i]+1 所以会访问到ma+1
{
c[i]+=val;//c[i]表示x坐标比i小个数的树状数组
i+=low(i);//i=0时会发生死循环
}
}
int getsum(int i)
{
int sum=0;
while(i>0)
{
sum+=c[i];
i-=low(i);
}
return sum;//getsum(i)表示x,y坐标都小于等于第i颗星星的x,y的个数,即第i颗星星的等级
}
int main()
{
memset(c,0,sizeof(c));
memset(ans,0,sizeof(ans));
while(cin>>n)
{
int i,x,y;
ma=0;
for(i=0;i<n;i++){
scanf("%d%d",&data[i],&y);
if(ma<data[i])ma=data[i];
}
for(i=0;i<n;i++)
{
ans[getsum(data[i]+1)]++;
update(data[i]+1,1);//因为星星的坐标会从0开始,所以位置要全部往后挪一位。
//之前没考虑这点,应该是WA啊,结果给了TLE,想想想也是i+=low(i);这条语句,当i=0时会发生死循环,下次要注意
}
for(i=0;i<n;i++)printf("%d\n",ans[i]);
}
return 0;
}
/*
6
0 2
1 1
5 1
7 1
3 3
5 5
*/
POJ 2352 Stars (树状数组)
最新推荐文章于 2020-06-27 15:07:28 发布