树状数组模板 Tree Array
2015-05-20 19:53
197 查看
---恢复内容开始---
这几天去浙江省选当垫底(Orz我是蒟蒻),然后顺便复习下树状数组
关于树状数组,其实很好理解,主要就是lowbit()操作的巧妙
树状数组是一种非常优雅的数据结构.当要频繁的对数组元素进行修改,同时又要频繁的查询数组内任一区间元素之和的时候,可以考虑使用树状数组.
换句话说,树状数组最基本的应用:
对于一个数组,如果有多次操作,每次的操作有两种:1、修改数组中某一元素的值,2、求和,求数组元素a[1]+a[2]+…a[num]的和。
——Km的小天地
其实树状数组自己写几个代码就很容易理解了,也可以参见这里(Km的小天地)
View Code
好吧我暂时就写到这一题树状数组,果然我还是太弱了ORZ各位神犇们
---恢复内容结束---
这几天去浙江省选当垫底(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各位神犇们
---恢复内容结束---
相关文章推荐
- 树状数组求逆序数(模板)
- 树状数组基本模板
- 文章标题 POJ 1195 :Mobile phones(二维树状数组 模板)
- 模板:二维树状数组 【洛谷P4054】 [JSOI2009]计数问题
- 树状数组的模板
- 树状数组、线段树模板(一)——单点更新 + HDU 1166 敌兵布阵
- hdoj 1166 敌兵布阵 (树状数组模板)
- hdu1166及树状数组模板
- 【模板】树状数组
- 【模板】二维树状数组
- 树状数组模板
- 洛谷 P3374 【模板】树状数组 1
- 二维树状数组模板
- P3374 【模板】树状数组 1 单点修改与区间查询
- 敌兵布阵(树状数组模板题)
- 树状数组模板
- 树状数组模板
- 敌兵布阵---hud1166(线段树或者树状数组模板)
- 树状数组求逆序和模板
- 树状数组模板