数星星 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 }