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; }