题意:
计算每个区间有多少个包含他的区间。
本题和POJ 2352的stras差不多,把区间看出二维坐标上的点,这可以看出在该点左上方的点数及为包含的区间数。
因此可以按照y从大到小的顺序排列,y相同的则按照x从小到大排列,就可以把二维的点变成用树状数组维护x就行了。
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<string.h>
#include<cmath>
#include<queue>
#include<string>
#include<map>
using namespace std;
typedef long long int ll;
const int MAN=1e5+10;
const int N=1e5+10;
int a[N],val[N];
struct node
{
int x,y;
int id;
bool operator <(const node &m)const
{
if(y!=m.y)
return y>m.y;
return x<m.x;
}
}P[N];
int lowbit(int x)
{
return x&-x;
}
int sum(int x)
{
int ans=0;
while(x)
{
ans+=a[x];
x-=lowbit(x);
}
return ans;
}
void add(int x)
{
while(x<=MAN)
{
a[x]++;
x+=lowbit(x);
}
}
int main()
{
int n;
while(~scanf("%d",&n),n)
{
memset(a,0,sizeof(a));
memset(val,0,sizeof(val));
for(int i=0;i<n;i++)
{
scanf("%d%d",&P[i].x,&P[i].y);
P[i].x++,P[i].y++;
P[i].id=i;
}
sort(P,P+n);
val[P[0].id]=sum(P[0].x);
add(P[0].x);
for(int i=1;i<n;i++)
{
if(P[i].x==P[i-1].x&&P[i].y==P[i-1].y)
{
val[P[i].id]=val[P[i-1].id];
}
else
{
val[P[i].id]=sum(P[i].x);
}
add(P[i].x);
}
for(int i=0;i<n;i++)
{
if(i==0)
printf("%d",val[i]);
else
printf(" %d",val[i]);
}
printf("\n");
}
return 0;
}