这题可以转化成如果按照s从小到大,e从大到小排好的话,每一种情况所对应的比他强壮的就只需要看此时有多少e大于等于他的e就行了。
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
const int n=100000+5;
struct node
{
int s,e;
int pos;
}pow[n+1];
int c[n+1];
int ans[n+1];
int cmp(node x,node y)
{
if(x.s!=y.s)
return x.s<y.s;
else
return x.e>y.e;
}
int lowbit(int k)
{
return (k&(-k));
}
int sum(int x) //求和
{
int ret = 0;
while(x>0)
{
ret+=c[x];
x-=lowbit(x);
}
return ret;
}
void add(int x,int d) //修改节点的值
{
while(x<=n)
{
c[x]+=d;
x+=lowbit(x);
}
}
int main()
{
int t;
int i,j;
while(~scanf("%d",&t)&&t)
{
memset(c,0,sizeof(c));
memset(ans,0,sizeof(ans));
for(i=0;i<t;i++)
{
scanf("%d%d",&pow[i].s,&pow[i].e);
pow[i].pos=i;
}
sort(pow,pow+t,cmp);
for(i=0;i<t;i++)
{
if(pow[i].s!=pow[i-1].s||pow[i].e!=pow[i-1].e)
{
ans[pow[i].pos]=sum(n)-sum(pow[i].e-1);
add(pow[i].e,1);
}
else
{
ans[pow[i].pos]=ans[pow[i-1].pos];
add(pow[i].e,1);
}
}
for(i=0;i<t-1;i++)
{
printf("%d ",ans[i]);
}
printf("%d\n",ans[i]);
}
return 0;
}