您的位置:首页 > 其它

poj 2481

2011-05-13 18:58 113 查看
题意:FJ有n头牛(编号为1~n),每一头牛都有一个测验值[S,
E],如果对于牛i和牛j来说,它们的测验值满足下面的条件则证明牛i比牛j强壮:Si <= Sj and
Ej <= Ei and Ei - Si > Ej -
Sj。现在已知每一头牛的测验值,要求输出每头牛有几头牛比其强壮。

代码:

#include<iostream>
#include<fstream>

using namespace std;

int n,m;

struct e{
int id,s,w;
};

e a[100011];

int cmp(const void *a,const void *b){
e *s=(e*)a;
e *t=(e*)b;
if(s->s!=t->s)
return s->s-t->s;
else
return t->w-s->w;
}

int b[100010];

int lowbit(int s){
return s&(-s);
}

void add(int s){
while(s<=m)
{
b[s]++;
s+=lowbit(s);
}
}

int getsum(int s){
int i=0;
while(s>0)
{
i+=b[s];
s-=lowbit(s);
}
return i;
}

int ans[100011];

void read(){
//	ifstream cin("in.txt");
int i,j,k;

while(scanf("%d",&n)!=EOF)
{
if(n==0) return;
memset(b,0,sizeof(b));
m=0;
for(i=1;i<=n;i++)
{
//	cin>>a[i].s>>a[i].w;
scanf("%d%d",&a[i].s,&a[i].w);
a[i].w++;
a[i].s++;
m=max(m,a[i].w);
a[i].id=i;
}
qsort(a+1,n,sizeof(e),cmp);
a[0].s=a[0].w=-1;
for(i=1;i<=n;i++)
{
if(a[i].s==a[i-1].s&&a[i].w==a[i-1].w)
{
ans[a[i].id]=ans[a[i-1].id];
add(a[i].w);
continue;
}
j=getsum(m);

j-=getsum(a[i].w-1);
ans[a[i].id]=j;
add(a[i].w);
}
for(i=1;i<=n;i++)
cout<<ans[i]<<' ';
cout<<endl;

}

}

int main(){
read();
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: