(以“ 分类:线段树分类:块状数组分类:树形结构 ==摘要== {{信息题|线段树练习|http://www.codevs.cn/problem/1080/|1|100|数组不够大|9...”为内容创建页面) |
小 (→题解: 链接修正) |
||
第7行: | 第7行: | ||
==题解== | ==题解== | ||
*线段树/树状数组/块状数组裸题。这题就写树状数组(Binary Indexed Tree,BIT,二分索引树)吧。 | *线段树/树状数组/块状数组裸题。这题就写树状数组(Binary Indexed Tree,BIT,二分索引树)吧。 | ||
− | ** | + | **树状数组的原理:参阅 http://blog.csdn.net/int64ago/article/details/7429868 |
− | ** | + | **树状数组的实现:参阅维基百科 http://zh.wikipedia.org/wiki/%E6%A0%91%E7%8A%B6%E6%95%B0%E7%BB%84 |
==代码== | ==代码== |
题目链接 | 难度等级 | 完成状态 | 完成分数 | 最后编辑时间 | 失误原因(初次提交分数) |
---|---|---|---|---|---|
线段树练习 | ★☆☆☆☆ | 答案正确 | 100 | 2015-2-4 17:10:36 | 数组不够大(90) |
数据结构,支持区间修改和求和。
1080.cpp代码已折叠
展开折叠内容
|
---|
#include<iostream> #include<cstdio> #include<algorithm> using namespace std; template<size_t N,typename T=int> class BIT { private: T bit[N]; const int Lowbit(const int &x) { return x&(-x); } public: size_t n; T a[N]; void Build() { for(int i=1;i<=n;++i) { bit[i]=a[i]; for(int j=i-1;j>i-Lowbit(i);j-=Lowbit(j)) bit[i]+=bit[j]; } } void Update(const int i,const int _delta) { a[i]+=_delta; for(int j=i;j<=n;j+=Lowbit(j)) bit[j]+=_delta; } const T GetSum(const int &k) { T ans(0); for(int i=k;i>0;i-=Lowbit(i)) { ans+=bit[i]; } return ans; } const T GetSum(const int &l,const int &r) { return GetSum(r)-GetSum(l-1); } }; BIT<1000000,int> bit; int main() { scanf("%d",&bit.n); for(int i=1;i<=bit.n;++i) { scanf("%d",&bit.a[i]); } bit.Build(); int m; scanf("%d",&m); for(int i=1,a,b,c;i<=m;++i) { scanf("%d%d%d",&a,&b,&c); if(a==1) { bit.Update(b,c); } else { printf("%d\n",bit.GetSum(b,c)); } } } |