POJ-2352 Stars(树状数组)
题目大意:给n个点的坐标,求出每一个点的左下方(允许同一行或同一列)的点的个数。
题目分析:题目中的坐标是先按y从小到大,再按x从小到大给出的。对于坐标 (xi,yi),只需考虑横坐标在0~xi之间的坐标已经出现了几个。用树状数组维护即可。
代码如下:
# include<iostream>
# include<cstdio>
# include<cstring>
# include<algorithm>
using namespace std;
const int N=10000;
int cnt[N*3+2005];
int ans[N+5005];
int lowbit(int x)
{
return x&(-x);
}
void add(int x)
{
if(x==0) ++cnt[x];
else{
while(x<=32000){
++cnt[x];
x+=lowbit(x);
}
}
}
int query(int x)
{
int res=0;
while(x>0){
res+=cnt[x];
x-=lowbit(x);
}
res+=cnt[0];
return res;
}
int main()
{
int n;
while(~scanf("%d",&n))
{
memset(cnt,0,sizeof(cnt));
memset(ans,0,sizeof(ans));
int x,y;
for(int i=0;i<n;++i){
scanf("%d%d",&x,&y);
++ans[query(x)];
add(x);
}
for(int i=0;i<n;++i)
printf("%d\n",ans[i]);
}
return 0;
}


浙公网安备 33010602011771号