今天在看程序竞赛的书,看到一段代码,是说树状数组的,书上讲得不怎么清楚,
自己也不是很理解,只知道可以这样用,但怎么构造成一个树就不是很明白了,希望大家指点一下。
数组:c[MAX];
函数:lowbit(int),insert(int),getsum(int);
代码如下:
#include <iostream>
#include <cstring>
#include <fstream>
using namespace std;
const int MAX = 1000;
int c[MAX];
int lowbit(int a){
return a & -a;
}
void insert(int a,int d,int max){
while(a<=max){
c[a] += d;
a += lowbit(a); //不是很明白这样做的意思
}
}
long getsum(int a){
int t = 0;
while(a > 0){
t += c[a];
a -= lowbit(a);
}
return t;
}
int main(){
ifstream cin("E:\\test.txt");
memset(c , 0 , sizeof(c));
int n ,i;
cin>>n;
for(i=1; i<=n ; i++){
insert(i,1,n);
}
insert(5,-2,n);
for(i=1; i<=n ; i++){
printf("%d ",getsum(i));
}
printf("\n");
return 0;
}
分享到:
相关推荐
二叉树是最简单的树形结构,每个节点最多有两个子节点。平衡树则通过保持高度平衡,确保了查找、插入和删除操作的高效性。 在这些源码中,你可以学习到如何在C/C++中创建和操作这些数据结构,这对于理解数据结构的...
树状数组的核心思想是通过特定的二进制索引操作,将一个一维数组转化为类似树形的数据结构,进而利用这种结构简化更新和查询操作。 在树状数组中,我们不直接维护前缀和数组S[],而是将其划分为若干个小区间和,并...
树状数组,也被称为线段树(Segment Tree),是一种数据结构,主要应用于处理区间查询与更新问题,在计算机科学,特别是算法竞赛(如ACM/ICPC)中有着广泛的应用。这个压缩包文件“树状数组资料”很可能包含了关于...
假设我们有一个数组`A = [1, 2, 3, 4, 5, 6, 7, 8]`,现在我们要构造对应的树状数组`C`,并通过树状数组来进行单点更新和前缀和查询。 1. **初始化树状数组**: ```c++ int A[] = {1, 2, 3, 4, 5, 6, 7, 8}; int...
8. **堆**:堆是一种特殊的树形数据结构,满足堆属性(父节点的值大于或小于其子节点)。最大堆和最小堆常用于优先队列的实现。 9. **散列表**:散列表(也称为哈希表)使用哈希函数将键映射到数组索引,提供快速的...
8. **堆**:堆是一种特殊的树形数据结构,满足最大堆或最小堆性质,常用于优先队列的实现。 9. **排序和查找算法**:快速排序、归并排序、冒泡排序、二分查找等是数据结构中常见的算法,它们直接影响到程序的运行...
5. **二叉树**:二叉树是每个节点最多有两个子节点的树形结构,常用于搜索和排序。这个系统可能包括了二叉树的创建、遍历(前序、中序、后序)、插入、删除等功能。 6. **图**:图由顶点和边组成,可以表示各种关系...
二叉树是最简单的树形结构,每个节点最多有两个子节点,分为左子节点和右子节点。二叉树有多种类型,如满二叉树、完全二叉树和平衡二叉树,它们在搜索、排序和文件系统中有广泛的应用。 第4章可能会讲解图,这是一...
递归往往用于处理树形结构或层次遍历的问题,而回溯法则常用于解决组合优化问题,如八皇后问题、N皇后问题等。 最后,LeetCode的挑战不仅仅是算法,还有良好的代码风格和时间空间复杂度分析。编写清晰、简洁的代码...
全排列的问题可以看作是搜索一个树形结构的叶子节点,其中每个节点代表一种排列。 在C/C++中,我们通常使用递归或回溯算法来解决全排列问题。递归是一种函数自我调用的方法,而回溯则是当遇到无效解或目标状态时,...
5. **堆**:堆是一种特殊的树形数据结构,通常用于优先队列的实现。它可以是最大堆(根节点大于或等于所有子节点)或最小堆(根节点小于或等于所有子节点)。C++标准库没有内置的堆类,但可以使用`<algorithm>`中的`...
二叉树是最基础的树形结构,通常用于查找和排序;平衡树则保证了操作的高效性。 6. **图**:图由顶点和边构成,用于表示对象之间的关系。图的遍历(深度优先搜索、广度优先搜索)和最短路径算法(Dijkstra、Floyd-...
在C/C++编程中,常见的数据结构包括数组、链表、栈、队列、树、图等。 #### Algorithm 算法 算法是指解决问题的一系列明确步骤或指令集。它是计算机程序的核心,用于指导如何处理输入并生成期望的输出。良好的算法...
含义其实就是用一个数组,构成树形结构来维护原数组的前缀和。 显然,对于树状数组C,C[I]对应“管辖”多少个元素,与它对应二进制数最右端第一个1的位置有关。这样,就能够达到询问一个区间的值,或者改变值的时间...
- 树形结构:二叉树、平衡树(AVL、红黑树)的操作和性质。 - 图论基础:图的表示、遍历(深度优先、广度优先)和最短路径算法(Dijkstra、Floyd)。 7. 面试题解析: - 编程题:提供常见面试编程题的解题思路和...
Trie树是一种特殊的树形结构,其中每个节点代表字符串中的一个字符。根节点通常不包含任何字符信息,而树的边则标记有字符。从根节点到任意叶子节点路径上的字符序列组成一个字符串,该字符串存储在树中。 #### ...
- 树形结构:二叉树的遍历(前序、中序、后序)、平衡树(AVL、红黑树)的性质和操作。 - 回溯与贪心策略:在解决组合优化问题时的应用。 4. **题目解答**: - 竞赛编程题目:从ACM/ICPC到LeetCode,涵盖了各种...
树状数组,也称为线段树(Segment Tree),是一种数据结构,主要应用于处理动态更新数组以及求解区间元素和的问题。它的核心思想是利用分治策略,将一个大问题分解成若干个小问题来解决,从而达到高效计算的目的。在...
树状数组,也称为二分索引树或BIT(Binary Indexed Tree),是一种数据结构,主要用于高效地处理动态数组上的区间查询和修改操作。在C++中,它通常用于实现对数组中某个区间元素求和的问题,同时保持高效的更新和...