我是靠谱客的博主 光亮蜡烛,这篇文章主要介绍训练八 树状数组,现在分享给大家,希望可以做个参考。

1.目的要求:
(1)理解树状数组的树形结构以及lowbit函数
(2)理解树形结构的计算方法对于计算效率的提升,例如最经典的RMQ问题
(3)利用树状数组解决Online Judge上面的题目
2.实验内容:
(1)经典区间和RMQ问题:有n个星星节点,存在星星节点左下角(包括正左和正下)的其他星星节点,则该星星节点比它左下角的星星节点大,level 0表示该星星节点没有比他还小的节点,level 1表示存在一个比该星星节点小的点。输出统计好的每个level等级存在多少星星节点 -来源HDU1285
3.实验报告:
(1)

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#include<iostream> #include<algorithm> #include<string.h> using namespace std; const int MAXN=15010; const int MAXX=32010; int c[MAXX];//树状数组的c数组 int cnt[MAXN];//统计结果 int lowbit(int x) { return x&(-x); } void add(int i,int val) { while(i<=MAXX) { c[i]+=val; i+=lowbit(i); } } int sum(int i) { int s=0; while(i>0) { s+=c[i]; i-=lowbit(i); } return s; } int main() { int n; int x,y; while(scanf("%d",&n)!=EOF) { memset(c,0,sizeof(c)); memset(cnt,0,sizeof(cnt)); for(int i=0;i<n;i++) { scanf("%d%d",&x,&y); int temp=sum(x+1); //加入x+1,是为了避免0,X是可能为0的 cnt[temp]++; add(x+1,1); } for(int i=0;i<n;i++) { printf("%dn",cnt[i]); } } return 0; }

最后

以上就是光亮蜡烛最近收集整理的关于训练八 树状数组的全部内容,更多相关训练八内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(79)

评论列表共有 0 条评论

立即
投稿
返回
顶部