就是给你一些星星的坐标,然后求出每个星星的左下角有多少颗星星
题目保证按照Y坐标的顺序给出每个星星的坐标,那么我们就可以说,当输入某个星星的坐标时,此时有多少个星星的横坐标小于它,它左下角就有多少星星。也就是转换成一个前缀和问题,算是树状数组的裸题。也是需要离散化一下。
1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 #include <iostream> 5 6 using namespace std; 7 const int maxn=32000+10; 8 int n; 9 int ans[maxn]; 10 int C[maxn]; 11 int name[maxn]; 12 int a[maxn]; 13 14 int lowbit(int x){ 15 return x&(-x); 16 } 17 void add(int v,int x){ 18 while(v<=n){ 19 C[v]+=x; 20 v+=lowbit(v); 21 } 22 } 23 int query(int v){ 24 int res=0; 25 while(v>0){ 26 res+=C[v]; 27 v-=lowbit(v); 28 } 29 return res; 30 } 31 int x,y; 32 int main(){ 33 scanf("%d",&n); 34 for(int i=1;i<=n;i++){ 35 scanf("%d%d",&x,&y); 36 a[i]=x; 37 name[i]=x; 38 } 39 sort(name+1,name+1+n); 40 for(int i=1;i<=n;i++){ 41 int d=lower_bound(name+1,name+1+n,a[i])-name; 42 ans[query(d)]++; 43 add(d,1); 44 } 45 for(int i=0;i<n;i++) 46 cout<<ans[i]<<endl; 47 48 return 0; 49 }