Stars URAL - 1028

就是给你一些星星的坐标,然后求出每个星星的左下角有多少颗星星

 

题目保证按照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 }
View Code

 

posted @ 2018-04-03 17:46  蒟蒻LQL  阅读(140)  评论(0编辑  收藏  举报