[hoj 2678]Stars[二维树状数组]

来源:互联网 发布:日本人写的c编程 编辑:程序博客网 时间:2024/05/05 12:04
二维树状数组的含义:

sum[i][j]表示从lowbit(i)<=x<=i,lowbit(j)<=y<=j之间的元素之和.

题意:

类似poj那道Stars,扩展到了三维.


#include <iostream>#include <cstring>#include <algorithm>using namespace std;const int MAXN = 15005;const int N = 1005;typedef struct point{    int x,y,z;}point;point p[MAXN];int c[N][N],s[MAXN];bool cmp(point a,point b){    if(a.z!=b.z)  return a.z<b.z;    if(a.y!=b.y)  return a.y<b.y;    return a.x<b.x;}inline int lowbit(int i){    return i&(-i);}int GetSum(int x,int y){    int ans = 0;    for(int i=x; i>0; i-=lowbit(i))        for(int j=y; j>0; j-=lowbit(j))            ans += c[i][j];    return ans;}void add(int x,int y, int v){    for(int i=x;i<N;i+=lowbit(i))        for(int j=y;j<N;j+=lowbit(j))            c[i][j] += v;}int main(){    int n;    while(cin>>n)    {        memset(c,0,sizeof(c));        memset(s,0,sizeof(s));        for(int i=1;i<=n;i++)            cin>>p[i].x>>p[i].y>>p[i].z;        sort(p+1,p+n+1,cmp);        for(int k=1;k<=n;k++)        {            s[GetSum(p[k].x+1,p[k].y+1)]++;            add(p[k].x+1,p[k].y+1,1);        }        for(int i=0;i<n-1;i++)            cout<<s[i]<<" ";        cout<<s[n-1]<<endl;    }    return 0;}


原创粉丝点击