树状数组浅谈 HDU 1166 敌兵布阵
2015-03-12 22:57
246 查看
这一块在寒假前就已经理解了,开学后再看的时候感觉有点生疏了,感觉还是在这总结一下比较好。
一维树状数组: 首先理解一个函数int lowbit( int x),这个函数是求从下标x-(x&(-x))+1开始计数,连续相加到下标x处,总共有x&(-x)个数相加。一维树状数组就是要求给你一个数组序列,以各个元素为叶子节点,从下往上构造一棵二叉树。假如某一个左孩子结点的编号为i,该父亲节点的编号为x+lowbit(x),若为右孩子结点,该父亲节点为x-lowbit(x)。
相关函数:
void add(int x,int b,int& n) { //Ax加上b,各个连续子序列的和的变化
while(x<=n) {
c[x]+=b;
x+=lowbit(x);
}
}
int getsum(int x) { //求出前x个数相加的和
int sum=0;
while(x>0) {
sum+=c[x];
x-=lowbit(x);
}
return sum;
}
二维树状数组:一维的理解了之后,只需要构造出一个C[x][y]
= sum(A[i][j]),其中,x-lowbit[x]+1 <= i<=x且y-lowbit[y]+1 <= j <=y。应用:
一个由数字构成的大矩阵,能进行两种操作
1) 对矩阵里的某个数加上一个整数(可正可负)
2) 查询某个子矩阵里所有数字的和
一维树状数组: 首先理解一个函数int lowbit( int x),这个函数是求从下标x-(x&(-x))+1开始计数,连续相加到下标x处,总共有x&(-x)个数相加。一维树状数组就是要求给你一个数组序列,以各个元素为叶子节点,从下往上构造一棵二叉树。假如某一个左孩子结点的编号为i,该父亲节点的编号为x+lowbit(x),若为右孩子结点,该父亲节点为x-lowbit(x)。
相关函数:
void add(int x,int b,int& n) { //Ax加上b,各个连续子序列的和的变化
while(x<=n) {
c[x]+=b;
x+=lowbit(x);
}
}
int getsum(int x) { //求出前x个数相加的和
int sum=0;
while(x>0) {
sum+=c[x];
x-=lowbit(x);
}
return sum;
}
二维树状数组:一维的理解了之后,只需要构造出一个C[x][y]
= sum(A[i][j]),其中,x-lowbit[x]+1 <= i<=x且y-lowbit[y]+1 <= j <=y。应用:
一个由数字构成的大矩阵,能进行两种操作
1) 对矩阵里的某个数加上一个整数(可正可负)
2) 查询某个子矩阵里所有数字的和
相关文章推荐
- HDU-1166- 敌兵布阵(树状数组 插点问线)
- HDU 1166 敌兵布阵 算法学习:线段树
- 【HDU 1166】敌兵布阵(树状数组)
- HDU 1166 敌兵布阵【线段树】
- HDU1166 敌兵布阵 【线段树】
- hdu 1166 敌兵布阵(线段树,单点更新)
- HDU 1166 敌兵布阵 (树状数组)
- hdu 1166 敌兵布阵【线段树Or树状数组】
- 【线段树】hdu 1166 敌兵布阵
- HDU 1166 敌兵布阵 (树状数组)
- HDU-1166:敌兵布阵
- HDU 1166 敌兵布阵(线段树区间和)
- HDU 1166 敌兵布阵
- HDU 1166 敌兵布阵 (线段树:单点增减求和)
- hdu-1166 敌兵布阵(树状数组)
- HDU 1166 敌兵布阵
- HDU 1166 敌兵布阵(树状数组)
- hdu 1166 敌兵布阵 线段树
- hdu 1166 敌兵布阵(线段树,树状数组)
- hdu 1166 敌兵布阵 线段树 单点更新