HOJ 2678 stars

跟HDU 1541 Stars相似,只不过那里是二维,这里是三维。先把数据都进来,先按z升序,相等的再按y升序,相等的再按x升序,然后做法就一样了,这里用二维树状数组。

#include 
#include 
#include 
#include 
using namespace std;
struct p
{
    int x,y,z;
}a[21111];
int c[1111][1111],level[21111],n;//二维的树状数组
bool comp(p a, p b)//排序
{
    if(a.z != b.z) return a.z < b.z;
    else if(a.y != b.y) return a.y < b.y;
    return a.x < b.x;
}
int lowbit(int x)
{
    return x&-x;
}
void add(int x,int y,int w)
{
    for(int i = x ; i <= 1111 ; i += lowbit(i))
    {
        for(int j = y ; j <= 1111 ; j += lowbit(j))
        {
            c[i][j] += w;
        }
    }
}
int query(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;
}
int main()
{
    while(scanf("%d",&n)!=EOF)
    {
        memset(c,0,sizeof(c));
        memset(level,0,sizeof(level));
        for(int i = 0 ; i < n ; i++)
            scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].z);
        sort(a,a+n,comp);
        for(int i = 0 ; i < n ; i++)
        {
            level[query(a[i].x+1,a[i].y+1)] ++;
            add(a[i].x+1,a[i].y+1,1);
        }
        for(int i = 0 ; i < n-1 ; i++)
            printf("%d ",level[i]);
        printf("%d\n",level[n-1]);
    }
    return 0;
}

你可能感兴趣的:(树状数组-并查集)