每个牛有一个区间[s,e],两个牛[s1,e1], [s2,e2],当s1<=s2并且e1>=e2并且e1-s1>e2-s2时,我们说牛1比牛2强,给N个牛的区间,对于每个牛,输出比这个牛强的牛的个数。
还是需要预处理,先对每个牛的e进行降序排序,e相同时对s进行升序排列,这样循环时可以保证后边的牛绝对不比前边的牛强。在循环时,只需找出比当前牛s小的牛的个数。如果遇到特殊情况,即两个牛区间完全一样,赋值就可以了
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn=100005;
int b[maxn];
int c[maxn];
int n;
struct cow
{
int l,r;
int dis;
}a[maxn];
int cmp(const cow &a,const cow &b)
{
if(a.r==b.r)
return a.l<b.l;
else
return a.r>b.r;
}
int lowbit(int x)
{
return x&-x;
}
void update(int x,int add)
{
while(x<=maxn)
{
c[x]+=add;
x+=lowbit(x);
}
}
int sum(int x)
{
int ret=0;
while(x)
{
ret+=c[x];
x-=lowbit(x);
}
return ret;
}
int main()
{
while(~scanf("%d",&n)&&n)
{
memset(c,0,sizeof(c));
memset(b,0,sizeof(b));
int p;
for(int i=0;i<n;i++)
{
scanf("%d%d",&a[i].l,&a[i].r);
a[i].dis=i;
a[i].l++;
a[i].r++;
}
sort(a,a+n,cmp);
for(int i=0;i<n;i++)
{
if(i&&a[i].l==a[i-1].l&&a[i].r==a[i-1].r)
b[a[i].dis]=b[a[i-1].dis];
else
b[a[i].dis]=sum(a[i].l);
update(a[i].l,1);
}
for(int i=0;i<n-1;i++)
printf("%d ",b[i]);
printf("%d\n",b[n-1]);
}
return 0;
}