【模板】树状数组2
2017-09-09 20:20
274 查看
题目
基本介绍
模板题目
代码实现
1.将某区间每一个数数加上x
2.求出某一个数的和
也就是说支持区间修改
我们可以看一下 Qi.DC 的想法 他说:“
我们在树状数组中可以用前 i 项的和来表示第 i 个数 那么当对 x ~ y 的区间进行修改的时候需要在树状数组中的第 x 个位置 + k 第 y + 1 个位置 -k 这样便维护了这个树状数组 输出时候直接输出查询即可”
这也就完成了区间修改
基本介绍
模板题目
代码实现
基本介绍
这篇是树状数组模板2 主要内容有:1.将某区间每一个数数加上x
2.求出某一个数的和
也就是说支持区间修改
我们可以看一下 Qi.DC 的想法 他说:“
我们在树状数组中可以用前 i 项的和来表示第 i 个数 那么当对 x ~ y 的区间进行修改的时候需要在树状数组中的第 x 个位置 + k 第 y + 1 个位置 -k 这样便维护了这个树状数组 输出时候直接输出查询即可”
这也就完成了区间修改
模板题目
见基本介绍代码实现
Qi.DC的思路#include<iostream> #include<cstdio> #include<cctype> using namespace std; #define in = read() typedef long long ll; const ll size = 500000 + 1000; #define lowbit(x) (x & -x) ll n,m; ll tree[size]; ll last,next; inline ll read(){ ll num = 0 , f = 1; char ch = getchar(); while(!isdigit(ch)){ if(ch == '-') f = -1; ch = getchar(); } while(isdigit(ch)){ num = num*10 + ch - '0'; ch = getchar(); } return num*f; } inline void add(ll x,ll y){ while(x <= n){ tree[x] += y; x += lowbit(x); } } inline ll query(ll x){ ll ans = 0; while(x){ ans += tree[x]; x -= lowbit(x); } return ans; } int main(){ n in; m in; for(int i=1;i<=n;i++){ ll now; now in; add(i,now - last); last = now; } while(m --){ ll que; que in; if(que == 1){ ll x,y,z; x in; y in; z in; add(x,z); add(y + 1,-z); } else if(que == 2){ ll x; x in; printf("%d\n",query(x)); } } } //COYG
相关文章推荐
- 树链剖分&树状数组区间加减区间求和模板
- hdu4000(一维树状数组模板)
- 树状数组模板
- P3368 【模板】树状数组 2(树状数组维护差分序列)
- 洛谷P3374 【模板】树状数组 1
- 树状数组-线段树模板题(leetcode-307)
- 树状数组,洛谷P3374 【模板】树状数组 1
- 树状数组解决区间求和问题(模板)
- P3374 【模板】树状数组 1
- 线段树+差分——【模板】树状数组2
- CS Academy Round #30 (Div. 2 only) C.Constant Sum(树状数组,区间修改,单点查询模板)
- POJ2352-Stars(树状数组模板)
- 初识树状数组(模板)
- 树状数组模板
- 树状数组模板
- 树状数组求逆序数的模板
- HDU 1556 Color the ball 树状数组-区间更新-模板
- 个人模板 树状数组
- 树状数组模板
- P3374 【模板】树状数组 1(单点增减,区间求和)