与stars类似,不过此题找的是左上角的值,
这样把e按照从大到小排序,s仍然是从小到大排序。
剩下的注意离散化就行了。
树状数组数以的是:一定不能从0开始,否则0+lowbit(0)=0,会陷入死循环
所以需要++;
代码如下:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=100010;
int a[maxn];
struct Cow
{
int s,e;
int pos;
}cow[maxn];
bool cmp(Cow a,Cow b)
{
if(a.e!=b.e) return a.e>b.e;
else return a.s<b.s;
}
int Lowbit(int x)
{
return x&(-x);
}
void update(int x,int val)
{
for(int i=x;i<maxn;i+=Lowbit(i))
a[i]+=val;
}
long long query(int x)
{
long long ans=0;
for(int i=x;i>0;i-=Lowbit(i))
ans+=a[i];
return ans;
}
int ans[maxn];
int main()
{
int n,x,y;
while(scanf("%d",&n),n){
memset(ans,0,sizeof(ans));
memset(a,0,sizeof(a));
for(int i=0;i<n;i++){
scanf("%d%d",&cow[i].s,&cow[i].e);
cow[i].pos=i;
cow[i].s++;cow[i].e++;
}
sort(cow,cow+n,cmp);
ans[cow[0].pos]=query(cow[0].s);
update(cow[0].s,1);
for(int i=1;i<n;i++){
if(cow[i].s==cow[i-1].s&&cow[i].e==cow[i-1].e)
ans[cow[i].pos]=ans[cow[i-1].pos];
else ans[cow[i].pos]=query(cow[i].s);
update(cow[i].s,1);
}
for(int i=0;i<n;i++){
if(i==0) printf("%d",ans[i]);
else printf(" %d",ans[i]);
}
puts("");
}
return 0;
}