分析:每一头牛都一片领域[s,e]如果一头牛的[s,e]包含另一头牛的[s,e],那么就比另一头牛强,于是我们先把牛排序,e大的排在前,相等的话就s小的排在前,这样排在前面的牛一定不会比排在后面的牛弱,如果两头牛的s和e都相等的话,那么比他们强壮的牛的数量也相等,不然的话求比一头牛强的数量只要求出s<=这头牛的牛的数量就可以。
# include <stdio.h>
# include <string.h>
# include <algorithm>
using namespace std;
typedef struct node
{
int s,e,num;
}Node;
int n,c[100005],ans[100005];
Node cow[100005];
bool cmp(Node a,Node b)
{
if(a.e==b.e)
return a.s<b.s;
else
return a.e>b.e;
}
int lowbit(int x)
{
return x&(-x);
}
int sum(int n)
{
int s=0;
while(n>0)
{
s+=c[n];
n-=lowbit(n);
}
return s;
}
void update(int i,int value)
{
while(i<=100005)
{
c[i]+=value;
i+=lowbit(i);
}
}
int main()
{
int i,s,e;
while(scanf("%d",&n),n!=0)
{
for(i=0;i<n;i++)
{
scanf("%d%d",&s,&e);
cow[i].s=++s;
cow[i].e=++e;
cow[i].num=i;
}
sort(cow,cow+n,cmp);
memset(c,0,sizeof(c));
for(i=0;i<n;i++)
{
if(i!=0&&cow[i].s==cow[i-1].s&&cow[i].e==cow[i-1].e)
ans[cow[i].num]=ans[cow[i-1].num];
else
ans[cow[i].num]=sum(cow[i].s);
update(cow[i].s,1);
}
for(i=0;i<n-1;i++)
printf("%d ",ans[i]);
printf("%d\n",ans[i]);
}
return n;
}