震惊!在复杂多变代码上百的数据结构中竟还有这样小而巧的存在!(树状数组)

第一次学树状数组时其实我是拒绝的。可能因为图比较抽象难理解吧= =。当时高二xio姐xio长讲的时候因为进度拉的比较快所以完全没法消化啊(:3J∠)

然而同时讲的线段树相比起来炒鸡好理解(但代码实现难度高一些qwq)

所以我们又可以得到一些狗p道理—————凡事都有它好的一面和坏的一面。(突然鸡汤)

嘛,对于初次接触数据结构的蒟蒻来说,当然是选取好理解的来写啦。然后这个抽象的东东一直拖到了现在才彻底消化(:3J∠)(真的是太弱啦!)

阿拉不会发图就超难受啦...qwq

就发个链接吧(其实我也懒得自己总结啦)

(http://blog.csdn.net/rentenglong2012/article/details/69230308)

然后放上炒鸡辣鸡的56行短代码(至少是目前我写的数据结构中最短的orz),dalao勿喷quq

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
using namespace std;

int n,m,op,x,y;
int a[600000],c[600000];

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

void add(int x,int k)
{
    while(x<=n)
    {
        c[x]+=k;
        x+=lowbit(x);
    }
}

int query(int x)
{
    int ans=0;
    while(x)
    {
        ans+=c[x];
        x-=lowbit(x);
    }
    return ans;
}

int main()
{
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;++i)
    {
        scanf("%d",&a[i]);
        add(i,a[i]);
    }
    for(int i=1;i<=m;++i)
    {
        scanf("%d%d%d",&op,&x,&y);
        switch(op)
        {
            case 1:add(x,y);break;
            case 2:printf("%d\n",query(y)-query(x-1));break;
        }
    }
    return 0;
}

后排提醒一下,每次访问返回的值是区间【1,x】的值,如果要求【l,r】之间的值就应该是query(r)的返回值-query(l-1)的返回值(注意区间开闭qwq)

是不是非常小而巧呢!(。◕ˇ∀ˇ◕)

所以遇到难题一定不要怕!要超霸气地冲上去把他干掉!(蜜汁鸡汤*2)

阿拉不多bb啦,over~

posted @ 2018-03-01 17:27  ฅ南瓜ฅ  阅读(132)  评论(0编辑  收藏  举报