思路:开始我以为这是一道二维树状数组,结果发现x,y过大会超空间,然后我发现n比较小,于是我就以为把x,y的范围缩小到n就可以了,结果还是超空间,然后看了下别人的博客才发现只要一维就可以了,我真的是脑子秀逗了,就知道套模板。。。
由输入可知,x y 是按照 y递增,y相等在x递增输入的,输入的点一定在当前点的下方,因此可以不用考虑y,只需要对前x求和即可,还有注意++x防止x=0;
Code :
#include<iostream>
#include<cstring>
using namespace std;
const int MAX_N=15005;
const int MAX_S=32005;
int n;
int C[MAX_S];
int ans[MAX_N];
int Lowbit(int x);
void Update(int id,int x);
int Query(int id);
int main()
{
ios::sync_with_stdio(false);
while(cin>>n){
memset(C,0,sizeof(C));
memset(ans,0,sizeof(ans));
int x,y;
for(int i=0;i<n;++i)
{
cin>>x>>y;
++ans[Query(++x)];
Update(x,1);
}
for(int i=0;i<n;++i)
cout<<ans[i]<<endl;
}
return 0;
}
int Lowbit(int x)
{
return x&(-x);
}
void Update(int id,int x)
{
while(id<MAX_S){
C[id]+=x;
id+=Lowbit(id);
}
}
int Query(int id)
{
int ans=0;
while(id>0){
ans+=C[id];
id-=Lowbit(id);
}
return ans;
}