您的位置:首页 > 其它

POJ 2481

2012-08-09 14:59 197 查看
  一道树状数组的应用题,和POJ 3067非常类似,这道题是求比自己强壮(e更大,s更小)的牛的数量。

  将POJ 3067的思路应用到这道题上,如果先对e按照降序排列,每加入一只牛,当前已经加入树状数组的牛的s如果比这只牛小,那么那些牛就更强壮,所以同样是在树状数组里的求和问题。同样,对s的排序规则关系到e相同时的情况,由于s更小就更强壮,所以先把s小的加入,于是s就按照升序排列。再考虑e和s都相同的情况,假设有一些牛的e和s都相同,为cow1,cow2.....,cowK,那么更强壮的牛的数量x,满足cow1=cow2=....=cowK=x。所以遇到e和s都相同的状况时,只需要复制答案就可以了。

  另外,由于排序后,顺序和开始给出数据时的顺序不同,所以需要记录一下开始给出数据时的顺序。

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAX_COW 100005
struct node
{
int s;
int e;
int order;
}cow[MAX_COW];
int c[MAX_COW],ans[MAX_COW];
int cmp(const void *,const void *);
inline lowbit(int);
int get_sum(int);
void update(int,int);
int main()
{
int n;
while(scanf("%d",&n)!=EOF&&n!=0)
{
int i;
for(i=1;i<=n;i++)
{
scanf("%d%d",&cow[i].s,&cow[i].e);
cow[i].s+=1;cow[i].e+=1;
cow[i].order=i;
}
qsort(&cow[1],n,sizeof(struct node),cmp);
memset(c,0,sizeof(c));
memset(ans,0,sizeof(ans));
ans[cow[1].order]=0;
update(cow[1].s,1);
for(i=2;i<=n;i++)
{
if(cow[i].e==cow[i-1].e&&cow[i].s==cow[i-1].s)
{
ans[cow[i].order]=ans[cow[i-1].order];
}
else
{
ans[cow[i].order]=get_sum(cow[i].s);
}
update(cow[i].s,1);
}
for(i=1;i<n;i++)
printf("%d ",ans[i]);
printf("%d\n",ans[i]);
}
return 0;
}
int cmp(const void *x,const void *y)
{
if((*(struct node *)x).e-(*(struct node *)y).e!=0)
{
return (*(struct node *)y).e-(*(struct node *)x).e;
}
return (*(struct node *)x).s-(*(struct node *)y).s;
}
inline int lowbit(int x)
{
return x&(-x);
}
int get_sum(int x)
{
int i,sum=0;
for(i=x;i>0;i-=lowbit(i))
{
sum+=c[i];
}
return sum;
}
void update(int x,int val)
{
int i;
for(i=x;i<MAX_COW;i+=lowbit(i))
{
c[i]+=val;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: