树状数组的学习

Posted hhkobeww

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了树状数组的学习相关的知识,希望对你有一定的参考价值。

一开始很难理解,反复的画图和倾读博客,才是对其有了理解,真是开心!

不懂的话可以看看这几篇博客,写的很棒!

转:

http://blog.csdn.net/lulipeng_cpp/article/details/7816527

http://blog.csdn.net/int64ago/article/details/7429868

http://blog.csdn.net/yhf_2015/article/details/53844284

自己写了一个简单得树状数组代码,用于:求前缀和,更新结点

#include<bits/stdc++.h>
using namespace std;
const int maxn = 1005;

int n,pos;
int a[maxn];
int c[maxn];

int Lowbit(int x)
{
    return x&(-x);
} 

//更新 
void Update(int pos, int num) //pos为更新的位置,num是要变化的值
{
    while(pos <= n)
    {
        c[pos] += num;//改变当前的值 
        pos += Lowbit(pos);//更新父亲结点 
    }
} 

//求和
int Getsum(int pos)//求位置pos的前缀和
{
    int sum = 0;
    while(pos > 0)
    {
        sum += c[pos]; //求和累加 
        pos -= Lowbit(pos);//向前减少 
    }
    return sum;
} 

int main()
{
    while(~scanf("%d",&n))
    {
        memset(c,0,sizeof(c));
        for(int i = 1; i <= n; i++)
        {
            scanf("%d",&a[i]);
            Update(i,a[i]);
        } 
        printf("输入所求的前缀和位置pos:");
        scanf("%d",&pos);
        printf("pos的前缀和为:%d\n",Getsum(pos));
        
        //更新
        Update(5,2);
        printf("更新后pos为6的前缀和为:%d\n",Getsum(6));
    }
    return 0;
}
/*
8
1 2 3 4 5 6 7 8
*/

 

以上是关于树状数组的学习的主要内容,如果未能解决你的问题,请参考以下文章

(填坑)树状数组1

树状数组 浅显学习

树状数组学习

数据结构:树状数组 学习笔记

树状数组review学习

学习笔记1-回顾树状数组与莫队思路