您的位置:首页 > 其它

树状数组浅谈 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) 查询某个子矩阵里所有数字的和
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: