首页 > 其他分享 >二维树状数组

二维树状数组

时间:2024-09-24 22:50:57浏览次数:10  
标签:return 树状 int lowbit sum add 二维 MAXN 数组

单点增加,范围查询

int tree[MAXN][MAXM];
int nums[MAXN][MAXM];
int n,m;
int lowbit(int i) {
    return i & -i;
}

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

// 从(1,1)到(x,y)这个部分的累加和
int sum(int x, int y) {
    int ans = 0;
    for (int i = x; i > 0; i -= lowbit(i)) {
        for (int j = y; j > 0; j -= lowbit(j)) {
            ans += tree[i][j];
        }
    }
    return ans;
}

// 实际二维数组的位置是(x,y)
// 树状数组上的位置是(x,y)
// 题目说的是单点更新,转化成单点增加(老值-新值)即可
// 不要忘了在nums中把老值改成新值
void update(int x, int y, int v) {
    add(x, y, v - nums[x][y]);
    nums[x][y] = v;
}

// 实际二维数组的位置是(x,y)
// 树状数组上的位置是(x, y)
int sumRegion(int a, int b, int c, int d) {
    return sum(c, d) - sum(a-1, d) - sum(c, b-1) + sum(a, b);
}

范围增加,单点查询(P4514)

// 维护信息 : d[i][j]
int tree1[MAXN][MAXM];
// 维护信息 : d[i][j] * i
int tree2[MAXN][MAXM];
// 维护信息 : d[i][j] * j
int tree3[MAXN][MAXM];
// 维护信息 : d[i][j] * i * j
int tree4[MAXN][MAXM];

int n, m;

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

void add(int x, int y, int v) {
    int v1 = v;
    int v2 = x * v;
    int v3 = y * v;
    int v4 = x * y * v;
    for (int i = x; i <= n; i += lowbit(i)) {
        for (int j = y; j <= m; j += lowbit(j)) {
            tree1[i][j] += v1;
            tree2[i][j] += v2;
            tree3[i][j] += v3;
            tree4[i][j] += v4;
        }
    }
}

// 以(1,1)左上角,以(x,y)右下角
int sum(int x, int y) {
    int ans = 0;
    for (int i = x; i > 0; i -= lowbit(i)) {
        for (int j = y; j > 0; j -= lowbit(j)) {
            ans += (x + 1) * (y + 1) * tree1[i][j] - (y + 1) * tree2[i][j] - (x + 1) * tree3[i][j] + tree4[i][j];
        }
    }
    return ans;
}

void add(int a, int b, int c, int d, int v) {
    add(a, b, v);
    add(a, d + 1, -v);
    add(c + 1, b, -v);
    add(c + 1, d + 1, v);
}

int range(int a, int b, int c, int d) {
    return sum(c, d) - sum(a - 1, d) - sum(c, b - 1) + sum(a - 1, b - 1);
}

标签:return,树状,int,lowbit,sum,add,二维,MAXN,数组
From: https://www.cnblogs.com/cly312/p/18430256

相关文章

  • 移动数组中数字的方法(c语言)
    1.移动一维数组中的内容;若数组中有n个整数,要求把下标从0到p(含p,p小于等于n-1)的数组元素平移到数组的最后。例如,一维数组中的原始内容为:1,2,3,4,5,6,7,8,9,10;p的值为3。移动后,一维数组中的内容应为:5,6,7,8,9,10,1,2,3,4。2.我们确定数组,然后输入交换的几次,意思就是先前移......
  • 【算法题】53. 最大子数组和-力扣(LeetCode)
    【算法题】53.最大子数组和-力扣(LeetCode)1.题目下方是力扣官方题目的地址53.最大子数组和给你一个整数数组nums,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。子数组是数组中的一个连续部分。示例1:输入:nums=[-2,1,-3,4,-1,2,1,-......
  • 【Azure Policy】在Azure Policy的规则中实现数组对数组的规则校验
    问题描述在之前的博文“ 【AzurePolicy】添加策略用于审计Azure网络安全组(NSG)规则--只能特定的IP地址允许3389/22端口访问 ”中,介绍了对固定IP地址,端口的审计规则。只是在实际使用中,发现端口和IP都可以输入多个值,并且以“,”号分割,最终在Azure的NSG资源中,显示为数组格......
  • java_day4_数组、方法
    一、数组一维数组数组:是一块连续固定大小的内存空间,有着索引的概念定义数组的语句格式:数据类型[]数组名;【推荐】数据类型数组名[];如果只是定义一个数组的话,没有给初始化值,相当于一个变量没有值,是不能够直接使用的如何对一个数组进行初始化?1、动态初始化......
  • 信息学奥赛复赛复习02-CSP-J2019-02-结构体、无构造函数、有构造函数、初始化列表构造
    PDF文档公众号回复关键字:2024092412019CSP-J题目2公交换乘[题目描述]著名旅游城市B市为了鼓励大家采用公共交通方式出行,推出了一种地铁换乘公交车的优惠方案在搭乘一次地铁后可以获得一张优惠票,有效期为45分钟,在有效期内可以消耗这张优惠票,免费搭乘一次票价不超过......
  • python中多维数组的cumsum的逆
    我想知道如何在Python中对多维数组进行累积和的逆运算。例如,我们可以通过PMy获得给定二维数组的累积数组T问题是,我如何从importnumpyasnpT=np.array([[1,3,2],[5,5,6],[1,8,3]])P=np.cumsum(np.cumsum(T,axis=0),axis=1)print(P)#Pisthe......
  • 抛开线性回归模型,基于树模型来尝试构建回归模型,可视化绘制树状层级结构
    一提到回归,可能很多人第一时间脑海里想到的就是线性回归模型,的确,线性回归器可以说是非常常用的模型了。线性回归模型广泛应用于各种领域,如经济学、金融学、社会科学、工程学等。它可以用于预测、因果分析、趋势分析等。线性回归模型是一种广泛应用于统计学和机器学习中的预测模......
  • useEffect为函数组件添加“副作用”
    最近在学习React,用了Hooks了,Hooks虽然好用,但是对于刚上手Hooks的小伙伴来说,可能不太理解useEffec和类组件中生命周期方法之间的关系,所以决定总结一下。如有不对,请多多指正!什么是副作用副作用是相对于主作用来说的,一个函数除了主作用,其他的作用就是副作用。对于React组件来说,主作......
  • 5.2 C# 数组声明与初始化全解
    文章目录5.2.1C#数组声明5.2.1C#数组声明1.声明数组的语法格式2.声明一维数组的语法格式格式1:声明但不初始化格式2:声明并初始化方式1:使用`new`关键字方式2:省略`new`关键字总结5.2.2C#数组的初始化5.2.2C#数组的初始化1.声明并初始化数组1.1使用`new......
  • 日新月异 PyTorch - numpy 基础: numpy 数组的添加和删除,以及常用函数
    源码https://github.com/webabcd/PytorchDemo作者webabcd日新月异PyTorch-numpy基础:numpy数组的添加和删除,以及常用函数示例如下:numpy\demo5.pyimportnumpyasnp#数组的添加和删除defsample1():a=np.array([[1,2,3],[4,5,6]])print(a)'......