POJ:2352 Stars(树状数组)
2013-11-07 13:50
453 查看
第一次写树状数组的题,居然1Y。好难得。
首先将x坐标离散化,这样使每个x都对应一个序号。然后按顺序遍历所有点,对于每个点x的序号对应一个偶数的树状数组结点,求它之前的和就是该点的level,然后该位置加1。如此循环直到结束。
另外就是注意我这样做之后树状数组的范围需要扩大一倍。
由于BIT理解不深,之前的代码有些不合适的地方。那就是没有必要非要将点加到BIT偶数位置上,其实奇偶位置都行。
空间就不需要那么大了。
首先将x坐标离散化,这样使每个x都对应一个序号。然后按顺序遍历所有点,对于每个点x的序号对应一个偶数的树状数组结点,求它之前的和就是该点的level,然后该位置加1。如此循环直到结束。
另外就是注意我这样做之后树状数组的范围需要扩大一倍。
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> #define MAXN 32005 using namespace std; bool vis[MAXN]; int ans[MAXN],flag[MAXN],a[MAXN],n; int lowbit(int x) { return (-x)&x; } int Sum(int pos) { int sum=0; while(pos>0) { sum+=a[pos]; pos-=lowbit(pos); } return sum; } void Add(int pos,int val) { while(pos<=2*n) { a[pos]+=val; pos+=lowbit(pos); } } struct Point { int x,y; }; Point p[15005]; int main() { int N; scanf("%d",&N); memset(vis,0,sizeof(vis)); memset(a,0,sizeof(a)); memset(ans,0,sizeof(ans)); memset(flag,0,sizeof(flag)); n=0; for(int i=1; i<=N; ++i) { scanf("%d%d",&p[i].x,&p[i].y); vis[p[i].x]=true; } for(int i=0; i<=MAXN; ++i) if(vis[i]) flag[i]=++n; for(int i=1; i<=N; ++i) { int pos=flag[p[i].x]*2; ans[Sum(pos)]++; Add(pos,1); } for(int i=0; i<N; ++i) printf("%d\n",ans[i]); return 0; }
由于BIT理解不深,之前的代码有些不合适的地方。那就是没有必要非要将点加到BIT偶数位置上,其实奇偶位置都行。
空间就不需要那么大了。
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> using namespace std; bool vis[32005]; int ans[15005],flag[32005],a[15005],n; int lowbit(int x) { return (-x)&x; } int Sum(int pos) { int sum=0; while(pos>0) { sum+=a[pos]; pos-=lowbit(pos); } return sum; } void Add(int pos,int val) { while(pos<=n) { a[pos]+=val; pos+=lowbit(pos); } } struct Point { int x,y; }; Point p[15005]; int main() { int N; scanf("%d",&N); memset(vis,0,sizeof(vis)); memset(a,0,sizeof(a)); memset(ans,0,sizeof(ans)); memset(flag,0,sizeof(flag)); n=0; for(int i=1; i<=N; ++i) { scanf("%d%d",&p[i].x,&p[i].y); vis[p[i].x]=true; } for(int i=0; i<=32005; ++i) if(vis[i]) flag[i]=++n; for(int i=1; i<=N; ++i) { int pos=flag[p[i].x]; ans[Sum(pos)]++; Add(pos,1); } for(int i=0; i<N; ++i) printf("%d\n",ans[i]); return 0; }
相关文章推荐
- POJ 2481 Cows && POJ 2352 Stars(树状数组妙用)
- poj 2352 Stars (树状数组)
- POJ 2352 Stars(树状数组)
- poj-2352-Stars【树状数组】
- poj 2352 Stars(树状数组)
- poj 2352 Stars (树状数组)
- POJ 2481 Cows && POJ 2352 Stars(树状数组妙用)
- POJ 2352 Stars(树状数组)
- poj 2352 Stars (树状数组 +1 的运用)
- POJ - 2352 Stars(树状数组)
- POJ 2352 HDU1541 Stars(树状数组)
- POJ-2352 Stars(树状数组)
- poj 2352 Stars(树状数组)
- 【原】 POJ 2352 Stars 树状数组 解题报告
- poj 2352 stars (树状数组)
- POJ---2352-Stars(树状数组)
- POJ-2352-Stars(树状数组)
- poj 2352 OR hdu 1541 Stars(数据结构:树状数组)
- poj 2352 Stars (树状数组)
- 【二维偏序】【树状数组】【权值分块】【分块】poj2352 Stars