美文网首页线段树
P3374【模板】树状数组

P3374【模板】树状数组

作者: 六十年目裁判长亚玛萨那度 | 来源:发表于2019-04-08 22:39 被阅读0次

树状数组其实就是快速计算区间值(log级别)的方法
例如:

arr[1] = arr[1]
arr[2] = arr[1] + arr[2]
arr[3] = arr[3]
arr[4] = arr[1] + arr[2] + arr[3] + arr[4]
arr[5] = arr[5]
arr[6] = arr[5] + arr[6]
arr[7] = arr[7]
arr[8] = arr[1] + arr[2] + arr[3] + arr[4] + arr[5] + arr[6] + arr[7] + arr[8]

形如一个满二叉树,只要画出来就能理解加法规则, 在这种情况下,需要求区间和arr[1]~arr[7] 只需要计算:arr[4] + arr[6] + arr[7]就行了。

代码中的预备知识由wiki提供的树状数组的基础。

#include <iostream>
using namespace std;

#define LSB(_a) ((_a) & -(_a)) 
#define SIZE 100005

int n, m;
int A[SIZE];

int lowbit(int k) {
   return k & -k;
}

int sum(int i) {
   int sum = 0;
   while (i > 0) 
       sum += A[i], i -= LSB(i);
   return sum;
}

void add(int i, int k) {
   while (i <= n) 
       A[i] += k, i += LSB(i);
}

int main() {
   int value;
   cin >> n >> m;
   for (int i = 1; i <= n; i++) {
       cin >> value;
       add(i, value);
   }
   while (m > 0) {
       int x, y, z;
       cin >> x >> y >> z;
       if (x == 1) {
           add(y, z);
       } 
       if (x == 2) {
           cout << sum(z) - sum(y - 1) << endl;
       }
       m -= 1;
   }
} 

相关文章

  • 三种一维树状数组

    单点修改+区间查询 最基本的树状数组 树状数组入门 模板(洛谷P3374 【模板】树状数组1) 区间修改+单点查询...

  • P3374【模板】树状数组

    树状数组其实就是快速计算区间值(log级别)的方法例如: arr[1] = arr[1]arr[2] = arr[...

  • 树状数组模板复习

    树状数组模板复习

  • 树状数组模板

    0X00 理解树状数组 没有学习过的同学可以看这个视频:树状数组 如果想非常顺利的写出这个模板,得记住下面这张图 ...

  • 树状数组模板

    [1] Leetcode 307. Range Sum Query - Mutable

  • 数据结构(二)

    树状数组 POJ 1990: MooFest关于x坐标建立树状数组。先按照v值升序排序,逐个添加到树状数组里。每次...

  • 树状数组求逆序对模板

  • 树状结构转一维数组

    树状结构转数组方法 声明树状对象

  • 树状数组

    复习一下树状数组 树状数组 一种用于处理单点修改和区间查询的数据结构。树状数组C的定义: C[x] = Sum ...

  • 树状数组求逆序对原理

    归并排序和树状数组都可以用nlogn的算法做到求出逆序对.但这里着重讲树状数组的原理与求法.树状数组最常用的方面就...

网友评论

    本文标题:P3374【模板】树状数组

    本文链接:https://www.haomeiwen.com/subject/simmiqtx.html