关于树状数组的概述,可以看一下这篇博客:http://blog.csdn.net/int64ago/article/details/7429868
树状数组是一个可以高效地进行区间统计的数据结构,在思想上类似于线段树,比线段树节省空间,编程复杂度比线段树低,但适用范围比线段树小。主要工作也是查询和更新。
例题:POJ - 2352 (http://poj.org/problem?id=2352)
题目大意:输入n个星星坐标,坐标按y递增顺序输入,y相同按x递增顺序输入。定义一个星星的级别是横纵坐标都不超过自己的星星个数(不包括自己),问级别为0~n-1的星星分别有多少个。
题目思路:我们可以发现,当前输入这个星星,跟后面的星星没有关系,因为后面输入的星星横纵坐标肯定会有超过当前星星的。所以只要把当前输入的x之前的横坐标加起来就可以了。树状数组非常非常的符合这个特性。要注意的一点是树状数组下标从1开始算,所以把题目输入的横坐标全部右移了一位。
代码: http://paste.ubuntu.com/16317880/
1 #include <iostream> 2 using namespace std; 3 int tree[32001],level[32001]; 4 int lowbit(int x){return x&(-x);} 5 int read(int k) 6 { 7 int sum=0; 8 while(k) 9 { 10 sum += tree[k]; 11 k -= lowbit(k); 12 } 13 return sum; 14 } 15 void add(int k) 16 { 17 while(k<=32001) 18 { 19 tree[k]++; 20 k += lowbit(k); 21 } 22 } 23 int main() 24 { 25 int n,i,x,y; 26 cin>>n; 27 for(i=0;i<n;i++) 28 { 29 cin>>x>>y; 30 level[read(x+1)]++; //全部x右移一位 31 add(x+1); 32 } 33 for(i=0;i<n;i++) 34 cout<<level[i]<<endl; 35 }
时间: 2024-10-13 21:05:20