就是给你一些星星的坐标,然后求出每个星星的左下角有多少颗星星
题目保证按照Y坐标的顺序给出每个星星的坐标,那么我们就可以说,当输入某个星星的坐标时,此时有多少个星星的横坐标小于它,它左下角就有多少星星。也就是转换成一个前缀和问题,算是树状数组的裸题。也是需要离散化一下。
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream> using namespace std;
const int maxn=+;
int n;
int ans[maxn];
int C[maxn];
int name[maxn];
int a[maxn]; int lowbit(int x){
return x&(-x);
}
void add(int v,int x){
while(v<=n){
C[v]+=x;
v+=lowbit(v);
}
}
int query(int v){
int res=;
while(v>){
res+=C[v];
v-=lowbit(v);
}
return res;
}
int x,y;
int main(){
scanf("%d",&n);
for(int i=;i<=n;i++){
scanf("%d%d",&x,&y);
a[i]=x;
name[i]=x;
}
sort(name+,name++n);
for(int i=;i<=n;i++){
int d=lower_bound(name+,name++n,a[i])-name;
ans[query(d)]++;
add(d,);
}
for(int i=;i<n;i++)
cout<<ans[i]<<endl; return ;
}