树状数组

心已赠人 2022-05-16 05:17 417阅读 0赞

树状数组单点修改,单点查询
洛谷oj :点我
模板:

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<algorithm>
  4. using namespace std;
  5. const int N=500000+5;
  6. int n,q;
  7. int a[N],tree[N];
  8. int lowbit(int x){
  9. return x&(-x);
  10. }
  11. void update(int x,int val){
  12. while(x<=n){
  13. tree[x]+=val;
  14. x+=lowbit(x);
  15. }
  16. }
  17. int query(int x){
  18. int sum=0;
  19. while(x>0){
  20. sum+=tree[x];
  21. x-=lowbit(x);
  22. }
  23. return sum;
  24. }
  25. int main(){
  26. scanf("%d%d",&n,&q);
  27. for(int i=1;i<=n;i++){
  28. scanf("%d",&a[i]);
  29. update(i,a[i]);
  30. }
  31. while(q--){
  32. int l,r;
  33. int flag;
  34. scanf("%d%d%d",&flag,&l,&r);
  35. if(flag==1){
  36. update(l,r);
  37. }
  38. else{
  39. printf("%d\n",query(r)-query(l-1));
  40. }
  41. }
  42. }

树状数组区间修改,单点查询
洛谷oj:点我
原来的数值存在a[]里面,tree[i]=a[i]-a[i-1];
求a[i]时,a[i]=a[i-1]+tree[i]=a[i-2]+tree[i]+tree[i-1]=…=tree[1]+tree[2]+…tree[i];

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<algorithm>
  4. using namespace std;
  5. const int N=500000+5;
  6. int n,q;
  7. int a[N],tree[N];
  8. int lowbit(int x){
  9. return x&(-x);
  10. }
  11. void update(int x,int val){
  12. while(x<=n){
  13. tree[x]+=val;
  14. x+=lowbit(x);
  15. }
  16. }
  17. int query(int x){
  18. int sum=0;
  19. while(x>0){
  20. sum+=tree[x];
  21. x-=lowbit(x);
  22. }
  23. return sum;
  24. }
  25. int main(){
  26. scanf("%d%d",&n,&q);
  27. for(int i=1;i<=n;i++){
  28. scanf("%d",&a[i]);
  29. update(i,a[i]-a[i-1]);
  30. }
  31. while(q--){
  32. int l,r,k;
  33. int flag;
  34. scanf("%d",&flag);
  35. if(flag==1){
  36. scanf("%d%d%d",&l,&r,&k);
  37. update(l,k);
  38. update(r+1,-k);
  39. }
  40. else{
  41. int x;
  42. scanf("%d",&x);
  43. printf("%d\n",query(x));
  44. }
  45. }
  46. }

发表评论

表情:
评论列表 (有 0 条评论,417人围观)

还没有评论,来说两句吧...

相关阅读

    相关 树状数组

    目录: 1. 概念 2. 应用 3. 充分性 4. 建立树状数组 5. 典题分析   一.概念 数组来模拟树形结构。那么、为什么不直接建树?没必要,因为树

    相关 树状数组

    1、概述 树状数组(binary indexed tree),是一种设计新颖的数组结构,它能够高效地获取数组中连续n个数的和。概括说,树状数组通常用于解决以下问题:数组\{a

    相关 树状数组

    树状数组 树状数组:用线性数据结构的方法解决动态统计子树权和的问题。 类似于线段树,将区间分成小段,方便计算权和。 举个栗子,将a数组构造成树状数组c。 如果a

    相关 树状数组初探

    前言 在前一篇文章:[线段树初探][Link 1] 中我们看了一下线段树的基本思想并且知道了线段树擅长于解决区间问题。其实对于某些区间问题,我们不仅可以用线段树解决,还可

    相关 树状数组实现

    树状数组能够完成如下操作: 给一个序列a0-an 计算前i项和 对某个值加x 时间o(logn) 注意:有人觉得前缀和就行了,但是你还要维护啊,改变某个值,一个一个改