数星星 Stars LibreOJ - 10114

原题链接

考察:树状数组

思路:

        数据中x,y按升序的方式给出,当前xi yi 对于在它前面的星星,y一定<=yi,x不定,对于它后面的星星,要么y>=yi要么x>=xi,可以发现后面的星星一定不在计算的范围内.于是我们可以边读数边计算1~xi的前缀和.

注意:x可以从0开始,add函数不允许下标是0,所以要进行偏移.

 1 #include <iostream>
 2 #include <algorithm>
 3 #include <cstring>
 4 using namespace std;
 5 const int N = 15010,M = 32010;
 6 typedef pair<int,int> PII;
 7 int n,a[M],sum[N];
 8 int lowbit(int x)
 9 {
10     return x&-x;
11 }
12 void add(int idx,int x)
13 {//为什么线段树下标必须从1开始,0的lowbit永远是0. 
14     for(int i=idx;i<=M-10;i+=lowbit(i))
15        a[i]+=x;
16 }
17 int query(int x)
18 {
19     int res = 0;
20     for(int i=x;i;i-=lowbit(i))
21       res+=a[i];
22     return res;
23 }
24 int main()
25 {
26     scanf("%d",&n);
27     for(int i=1;i<=n;i++)
28     {
29         int x,y; scanf("%d%d",&x,&y);
30         int d = query(x);
31         sum[d]++;
32         add(x,1);
33     }
34     for(int i=0;i<n;i++) printf("%d\n",sum[i]);
35     return 0;
36 }

 

posted @ 2021-03-03 19:14  acmloser  阅读(75)  评论(0编辑  收藏  举报