pku 2481 Cows(树状数组)

题意转为统计(x,y)的右上方的点数有多少,和Stars差不多,不过注意重合的区间

 

离散化X,2724K,1079MS
#include <stdio.h>
#include <string.h>
#include <algorithm>

using namespace std;

#define MAXN 100010

struct PNode
{
    int x,y;
    int id;
} pos[MAXN];
inline bool mycmp(const PNode &p1,const PNode &p2)
{
    if(p1.y!=p2.y) return p1.y>p2.y;//降序
    return p1.x<p2.x;//升序
}

int n,c[MAXN],num[MAXN],sortedx[MAXN],xhash[MAXN];

inline int lowbit(int x)
{
    return x&(-x);
}
void update(int x,int delta)
{
    while(x<=n)
    {
        c[x]+=delta;
        x+=lowbit(x);
    }
}
int getSum(int x)
{
    int s=0;
    while(x>0)
    {
        s+=c[x];
        x-=lowbit(x);
    }
    return s;
}

int main()
{
#ifndef ONLINE_JUDGE
    freopen("tdata.txt","r",stdin);
#endif
    int i;
    pos[0].x=pos[0].y=-1;
    sortedx[0]=-1;
    pos[0].id=0;
    while(scanf("%d",&n),n)
    {
        memset(c,0,sizeof(*c)*(n+1));
        memset(num,0,sizeof(*num)*(n+1));
        for(i=1; i<=n; i++)
        {
            scanf("%d %d",&pos[i].x,&pos[i].y);
            pos[i].id=i;
            sortedx[i]=pos[i].x;
        }
        sort(pos+1,pos+n+1,mycmp);
        sort(sortedx+1,sortedx+n+1);
        //     for(i=1;i<=n;i++) printf("%d %d\n",pos[i].x,pos[i].y);printf("\n");
        int idx=1;
        for(i=1; i<=n; i++)
            if( sortedx[i] != sortedx[i-1] ) xhash[ sortedx[i] ] = idx++;

        for(i=1; i<=n; i++)
        {
            int x = xhash[ pos[i].x ];
            //       printf("(%d,%d)  x=%d ",pos[i].x,pos[i].y,x);
            if( pos[i].x == pos[i-1].x && pos[i].y == pos[i-1].y )
                num[ pos[i].id ] = num[ pos[i-1].id ];
            else num[ pos[i].id ] = getSum(x);
            //     printf("num[%d]=%d\n",pos[i].id,num[pos[i].id]);system("pause");
            update(x,1);
        }
        for(i=1; i<=n; i++)
            if(i==1) printf("%d",num[ i ]);
            else printf(" %d",num[ i ]);
        printf("\n");
    }
    return 0;
}


//******************************************************************************

不离散化,2128K,1016MS
#include <stdio.h>
#include <string.h>
#include <algorithm>

using namespace std;

#define MAXN 100010

struct PNode
{
    int x,y;
    int id;
} pos[MAXN];
inline bool mycmp(const PNode &p1,const PNode &p2)
{
    if(p1.y!=p2.y) return p1.y>p2.y;
    return p1.x<p2.x;
}

int n,c[MAXN],num[MAXN];

inline int lowbit(int x)
{
    return x&(-x);
}
void update(int x,int delta)
{
    while(x<=n)
    {
        c[x]+=delta;
        x+=lowbit(x);
    }
}
int getSum(int x)
{
    int s=0;
    while(x>0)
    {
        s+=c[x];
        x-=lowbit(x);
    }
    return s;
}

int main()
{
#ifndef ONLINE_JUDGE
    freopen("tdata.txt","r",stdin);
#endif
    int i;
    pos[0].x=pos[0].y=-1;
    pos[0].id=0;
    while(scanf("%d",&n),n)
    {
        memset(c,0,sizeof(*c)*(n+1));
        memset(num,0,sizeof(*num)*(n+1));
        for(i=1; i<=n; i++)
        {
            scanf("%d %d",&pos[i].x,&pos[i].y);
            pos[i].id=i;
        }
        sort(pos+1,pos+n+1,mycmp);
        //     for(i=1;i<=n;i++) printf("%d %d\n",pos[i].x,pos[i].y);printf("\n");
        for(i=1; i<=n; i++)
        {
            int x = pos[i].x + 1;
            //         printf("(%d,%d)  x=%d ",pos[i].x,pos[i].y,x);
            if( pos[i].x == pos[i-1].x && pos[i].y == pos[i-1].y )
                num[ pos[i].id ] = num[ pos[i-1].id ];
            else num[ pos[i].id ] = getSum(x);
            //         printf("num[%d]=%d\n",pos[i].id,num[pos[i].id]);system("pause");
            update(x,1);
        }
        for(i=1; i<=n; i++)
            if(i==1) printf("%d",num[ i ]);
            else printf(" %d",num[ i ]);
        printf("\n");
    }
    return 0;
}

posted @ 2010-09-07 23:36  菜到不得鸟  阅读(148)  评论(0)    收藏  举报