第一次学树状数组时其实我是拒绝的。可能因为图比较抽象难理解吧= =。当时高二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~