【树状数组】树状数组一维二维模板

以下模板都是点更新,区间查询,如果是区间更新点查询,只需将利用lowbit的循环方向倒过来



一维:

inline int lowbit(int x)
{
    return x & -x;
}

void add(int x, int val)
{
    for(int i = x; i <= n; i += lowbit(i)) C[i] += val;
}

int sum(int x)
{
    int ret = 0;
    for(int i = x; i > 0; i -= lowbit(i)) ret += C[i];
    return ret;
}

二维:

inline int lowbit(int x)
{
    return x & -x;
}

void add(int x, int y, int val)
{
    for(int i = x; i <= n; i+=lowbit(i)) {
        for(int j = y; j <= n; j+=lowbit(j)) {
            C[i][j] += val;
        }
    }
}

int sum(int x, int y)
{
    int ret = 0;
    for(int i = x; i > 0; i-=lowbit(i)) {
        for(int j = y; j > 0; j-=lowbit(j)) {
            ret += C[i][j];
        }
    }
    return ret;
}
时间: 2024-10-23 17:17:46

【树状数组】树状数组一维二维模板的相关文章

c++ 依据输入动态声明数组(一维,二维)

较早的编译器是不同意这样做的,所以一些书籍比方以Tc解说的书本都说数组的下标不能是变量.在vc6.0下亦是如此. 只是在一些较新的编译器如dev c++已经支持了,例如以下代码不会报错 #include <stdio.h> #include <stdlib.h> int main() { int a; int i; scanf("%d",&a); int c[a]; for( i =0 ;i<a;i++) scanf("%d",

将树形结构的数组按照顺序遍历为二维数组

/** * 将树形结构的数组按照顺序遍历为二维数组 * renxing,2015年8月7日 11:06:47 */ function arr_child ($array) { static $res; if (!is_array($array)) { return false; } foreach ($array as $k=>$v) { if (is_array($v) && isset($v['child'])) { $child = $v['child']; //将这个数组的子

稀疏数组的经典应用(二维数组与稀疏数组的相互转换)

package com.zhangwl.数据结构.稀疏数组; /** * @ClassName SparseArray * @Description 棋盘游戏演示 * @Author zhangwl * @Date 2019/10/10 22:54 * @Version 1.0 **/public class SparseArray { public static void main(String[] args) { /*创建一个原始的二维数组11 * 11 ,0:表示没有棋子 :1:表示黑子:

[blog 机器视觉]一维二维码的提取、识别和产生

一维二维码的提取.识别和产生 零.相关说明: 在"jsxyhelu.cnblogs.com/机器视觉"栏目主要介绍和图像处理和机器视觉相关的的成套的解决方案.思路和软件集.希望能够为大家在实际工作中解决具体问题提供一些帮助. 一.背景资料: 现在一维码.二维码广泛使用于工业各方面.很多和图像处理相关的需求也有所涉及.这里也看过一些论文,里面有一些方法还是art-of-air的,也有一些具备一定参考价值.这里只是谈一谈一般情况下的提取和识别.对于特殊情况,肯定要特殊对待,其实本身是一个增

一维 + 二维树状数组 + 单点更新 + 区间更新 详解

树状数组详解: 假设一维数组为A[i](i=1,2,...n),则与它对应的树状数组C[i](i=1,2,...n)是这样定义的: C1 = A1 C2 = A1 + A2 C3 = A3 C4 = A1 + A2 + A3 + A4 C5 = A5 C6 = A5 + A6 ................. C8 = A1 + A2 + A3 + A4 + A5 + A6 + A7 + A8 ................ 如图可知: 为奇数的时候他是代表他本身,而为偶数的时候则是代表着自

资瓷区间修改+区间求和的树状数组(一维/二维)

一维:令 \(v_i\) 为差分数组,那么 \([0, k]\) 的前缀和就是 \(\sum{v_i(k+1-i)} = (k+1) \cdot \sum{v_i} + \sum{v_i \cdot (-i)}\),树状数组维护一下 \(v_i\) 和 \(v_i \cdot i\) 即可. template <typename I> struct Fenwick { struct Node { I v0, v1; void add(I d0, I d1) { v0 += d0; v1 +=

一维数组、二维数组用数学公式初始化以及二维数组的行坐标可省

<span style="font-size:14px;">#include<stdio.h> #include<stdlib.h> //二维数组赋值 void show2() { int a[3][4]; int k=0; for(int i=0;i<3;i++) { for(int j=0;j<4;j++) { a[i][j]=i*4+(j+1);//数学公式 赋值 // a[i][j]= ++k;//与上面效果一致 printf(&

c语言中二维数组作函数参数以及二维数组的理解

当二维数组作函数参数接受主调函数中的二维数组时,退化为一个指向数组的指针. 在此引用<c与指针>中的观点:作为函数 参数的多位数组名的穿递方式和一维数组名相同--实际传递的是个指向数组第一个元素的指针.但是,两者之间的区别在于, 多维数组的每个元素本身是另外一个数组,编译器需要知道它的维数,以便为函数形参的下标表达式进行求值.

编程之美——字数组之和的最大值(二维,动态规划)

把前一个问题扩展了一下,寻找二维数组中,从(x1, y1)到(x2, y2)确定的矩形区域的数据之和最大值. 解法一给出了一个技巧,建立一个和原数组一样大的数组,用来保存(0, 0)到(x, y)的和,即P[x][y] = sum(x[0][0] –> x[x][y]).然后用Sum = PS[i_max][j_max]  - PS[i_min - 1][j_max] – PS[i_max][j_min - 1] + PS[i_min - 1][i_min -1].不知道书上为什么要让数组从1开