码迷,mamicode.com
首页 > 编程语言 > 详细

树状数组的学习

时间:2018-03-11 14:41:46      阅读:198      评论:0      收藏:0      [点我收藏+]

标签:namespace   space   date   开心   body   lan   post   tar   求和   

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

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

转:

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
*/

 

树状数组的学习

标签:namespace   space   date   开心   body   lan   post   tar   求和   

原文地址:https://www.cnblogs.com/hhkobeww/p/8543407.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!