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;
}
浙公网安备 33010602011771号