您的位置:首页 > 理论基础 > 数据结构算法

数据结构:树状数组

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;
}

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: