poj 2481
题意: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;
}
浙公网安备 33010602011771号