数据结构:树状数组
2016-05-09 21:22
267 查看
关于树状数组的概述,可以看一下这篇博客:https://www.geek-share.com/detail/2544635302.html
树状数组是一个可以高效地进行区间统计的数据结构,在思想上类似于线段树,比线段树节省空间,编程复杂度比线段树低,但适用范围比线段树小。主要工作也是查询和更新。
例题:POJ - 2352 (http://poj.org/problem?id=2352)
题目大意:输入n个星星坐标,坐标按y递增顺序输入,y相同按x递增顺序输入。定义一个星星的级别是横纵坐标都不超过自己的星星个数(不包括自己),问级别为0~n-1的星星分别有多少个。
题目思路:我们可以发现,当前输入这个星星,跟后面的星星没有关系,因为后面输入的星星横纵坐标肯定会有超过当前星星的。所以只要把当前输入的x之前的横坐标加起来就可以了。树状数组非常非常的符合这个特性。要注意的一点是树状数组下标从1开始算,所以把题目输入的横坐标全部右移了一位。
代码: http://paste.ubuntu.com/16317880/
#include <iostream> using namespace std; int tree[32001],level[32001]; int lowbit(int x){return x&(-x);} int read(int k) { int sum=0; while(k) { sum += tree[k]; k -= lowbit(k); } return sum; } void add(int k) { while(k<=32001) { tree[k]++; k += lowbit(k); } } int main() { int n,i,x,y; cin>>n; for(i=0;i<n;i++) { cin>>x>>y; level[read(x+1)]++; //全部x右移一位 add(x+1); } for(i=0;i<n;i++) cout<<level[i]<<endl; }
相关文章推荐
- 数据结构之树状数组
- Codeforces Round #248 (Div. 2) B题 【数据结构:树状数组】
- 数据结构之树状数组
- poj 2299 Ultra-QuickSort(数学:求逆序数||数据结构:树状数组)
- 树状数组---数据结构
- 【数据结构之树状数组】从零认识树状数组
- CodeVS1369 xth 砍树 解题报告【数据结构】【线段树/树状数组】
- 数据结构之树状数组
- 【数据结构之树状数组】
- 【数据结构之树状数组】
- Codeforces Round #248 (Div. 2) B称号 【数据结构:树状数组】
- BZOJ3790 神奇项链 解题报告【字符串】【Manacher】【树状数组】【数据结构优化DP】
- 树状数组学习 ----- 数据结构
- HDU 4417 超级马里奥 数据结构+利用树状数组进行快速统计+多维统计转换
- 数据结构之树状数组
- 数据结构之树状数组
- 数据结构之树状数组
- Uva 11990 "Dynamic" Inversion(树状数组 + 数据结构分块)
- 【NOIp复习】数据结构之树状数组
- 数据结构之树状数组