POJ 2352 Stars(树状数组)
http://poj.org/problem?id=2352
题意:给出N(0~15000)个点的坐标,每个点左下点的个数为该点的高度,问高度为0~N-1的点个有多少个
左下。。。看起来很没思路,因为是二维坐标,但是仔细想想,把y值相同的点看成一层,一层一成的往上求就是了
用树状数组,感觉计算和的这种用树状数组比线段树好写多了
代码:
#include<iostream> #include<cstdio> #include<cstring> #include<string> #define nMAX 32100 using namespace std; int ans[nMAX],c[nMAX]; int lowbit(int x) { return x&(-x); } void add(int i,int w) { while(i<nMAX) { c[i]+=w; i+=lowbit(i); } } int sum(int i) { int ans=0; while(i>=1) { ans+=c[i]; i-=lowbit(i); } return ans; } int main() { int n,i,j,k; while(~scanf("%d",&n)) { memset(c,0,sizeof(c)); memset(ans,0,sizeof(ans)); for(k=1;k<=n;k++) { scanf("%d%d",&i,&j); i++; ans[sum(i)]++; add(i,1); } for(i=0;i<n;i++) printf("%d\n",ans[i]); } return 0; }