如果我们先对E从大到小排序,这时候我们对于每个cow,只需要考虑这个奶牛前面的奶牛(后面的奶牛E比他小,不可能比他强壮),计算这个奶牛前面有几个奶牛的S小于其S,就可以了
#include<cstdio>
#include<cstring>
#include<algorithm>
#define MAX(x,y) ((x)>(y)?(x):(y))
#define MAX_N 100010
using namespace std;
int bit[MAX_N];
long long cou[MAX_N];
int num;
struct cow
{
int x,y,id;
}Cow[MAX_N];
bool cmp(cow a,cow b)
{
if(a.y==b.y)
return a.x<b.x;
else
return a.y>b.y;
}
void add(int i)
{
while(i<=num+1)
{
bit[i]+=1;
i+=i&-i;
}
}
long long sum(int i)
{
long long res=0;
while(i>0)
{
res+=bit[i];
i-=i&-i;
}
return res;
}
int main()
{
int n;
while(~scanf("%d",&n)&&n)
{
memset(bit,0,sizeof(bit));
memset(cou,0,sizeof(cou));
num=0;
for(int i=0;i<n;i++)
{
scanf("%d%d",&Cow[i].x,&Cow[i].y);
Cow[i].id=i;
num=MAX(num,Cow[i].x);
}
sort(Cow,Cow+n,cmp);
for(int i=0;i<n;i++)
{
if(i>0&&Cow[i].x==Cow[i-1].x&&Cow[i].y==Cow[i-1].y)
{
cou[Cow[i].id]=cou[Cow[i-1].id];
}
else
{
cou[Cow[i].id]=sum(Cow[i].x+1);
}
add(Cow[i].x+1);
}
for(int i=0;i<n;i++)
printf("%lld ",cou[i]);
printf("\n");
}
}