您的位置:首页 > 其它

树状数组模板 Tree Array

2015-05-20 19:53 197 查看
---恢复内容开始---

这几天去浙江省选当垫底(Orz我是蒟蒻),然后顺便复习下树状数组

关于树状数组,其实很好理解,主要就是lowbit()操作的巧妙


树状数组是一种非常优雅的数据结构.当要频繁的对数组元素进行修改,同时又要频繁的查询数组内任一区间元素之和的时候,可以考虑使用树状数组.
换句话说,树状数组最基本的应用:
对于一个数组,如果有多次操作,每次的操作有两种:1、修改数组中某一元素的值,2、求和,求数组元素a[1]+a[2]+…a[num]的和。

——Km的小天地


其实树状数组自己写几个代码就很容易理解了,也可以参见这里(Km的小天地)

# include <iostream>
# include <stdio.h>
# include <string.h>
using namespace std;
int a[50010], c[50010], n, sum[50010]={};
int lowbit(int x) {return x&(-x);}
void mdf(int p, int del) {
while(p<=n) {
c[p]+=del;
p+=lowbit(p);
}
}
int ca(int dg) {
int r=0;
while(dg!=0) {
r+=c[dg];
dg-=lowbit(dg);
}
return r;
}
int main() {int T,ft;
scanf("%d", &T);ft=T;
while(T--) {
printf("Case %d:\n",ft-T);
scanf("%d", &n);
for (int i=1;i<=n;++i) {
scanf("%d", &a[i]);
sum[i]=sum[i-1]+a[i];
c[i]=sum[i]-sum[i-lowbit(i)];
}
//for (int i=1;i<=n;++i) printf("%d ", c[i]);
while(1) {
char st[10]; int ta,tb;
scanf("%s", st);
//printf("%s %d %d",st,ta,tb);
if (strcmp(st,"End")==0) break;
scanf("%d %d",&ta,&tb);
if (strcmp(st,"Add")==0) {
mdf(ta,tb);
}
else if (strcmp(st,"Sub")==0) {
mdf(ta,-1*tb);
}
else if (strcmp(st,"Query")==0) {
if(ta>tb) {int p=ta;ta=tb;tb=p;}
printf("%d\n",ca(tb)-ca(ta-1));
}
}}
return 0;
}


View Code
好吧我暂时就写到这一题树状数组,果然我还是太弱了ORZ各位神犇们

---恢复内容结束---
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: