图片详解 —— 二维树状数组

news2024/10/5 23:28:43

\qquad 想要完全理解二维树状数组,要先完全理解一维树状数组。这里给大家推荐一个视频:五分钟丝滑动画讲解 | 树状数组。建议大家先看一遍视频再来看下面的讲解。

\qquad 在一维树状数组中, t r e [ i ] tre[i] tre[i] 可以理解为以 i i i 为结尾的长度为 l o w b i t ( i ) lowbit(i) lowbit(i) 的数之和。

\qquad 列如: l o w b i t ( 12 ) = 4 lowbit(12)=4 lowbit(12)=4 所以 t r e [ 12 ] tre[12] tre[12] 表示以 12 12 12 结尾的长度为 4 4 4 的数的和,即下图中标红的地方。

在这里插入图片描述

\qquad 那么我们可以尝试用 t r e [ i ] [ j ] tre[i][j] tre[i][j] 表示右下角在第 i i i 行,第 j j j 列,宽为 l o w b i t ( j ) lowbit(j) lowbit(j),高为 l o w b i t ( i ) lowbit(i) lowbit(i) 的矩阵。

\qquad 例如: l o w b i t ( 10 ) = 2 lowbit(10)=2 lowbit(10)=2 所以 t r e [ 10 ] [ 12 ] tre[10][12] tre[10][12] 表示右下角在第 10 10 10 行,第 12 12 12 列,宽为 4 4 4,高为 2 2 2 的矩阵,即下图中标红的地方。

在这里插入图片描述

\qquad 在一维树状数组中, 12 12 12 的前缀和为 t r e [ 8 ] + t r e [ 12 ] tre[8]+tre[12] tre[8]+tre[12],即下图中标红的两个地方。

在这里插入图片描述

\qquad 13 13 13 得前缀和为 t r e [ 8 ] + t r e [ 12 ] + t r e [ 13 ] tre[8]+tre[12]+tre[13] tre[8]+tre[12]+tre[13],即下图中标紫的三个地方。

在这里插入图片描述

\qquad 我们把它们对应到二维矩阵中:

在这里插入图片描述

所以要求右下角在第 12 12 12 行,第 13 13 13 列的矩阵前缀和,就需要将下图标绿的矩阵求和。

在这里插入图片描述
\qquad 那么在代码中,我们就只需要写两层循环,一层遍历行的的 l o w b i t lowbit lowbit,一层遍历列的的 l o w b i t lowbit lowbit,将所有遍历到的矩阵求和。

// 查询左上角在 第一行第一列,右下角在第 H 行第 L 列的矩阵之和
inline ll query(ll H,ll L){
   ll res=0;
   // 遍历行的 lowbit 
   for(ll i=H;i>=1;i-=lowbit(i)){
   	// 遍历列的 lowbit
   	for(ll j=L;j>=1;j-=lowbit(j)) {
   		res+=tre[i][j];
   	}
   }
   return res;
}

\qquad 好,那么你已经学会了二维树状数组的区间查询,接下来我们看单点修改。

\qquad 不想画图了,原理和上面的差不多,直接上代码。

// 将第 H 行,第 L 列的数加上 k 
inline modify(ll H,ll L,ll k){
	// 遍历行的 lowbit 
	for(ll i=H;i<=n;i+=lowbit(i)){
		// 遍历列的 lowbit 
		for(ll j=L;j<=m;j+=lowbit(j)){
			tre[i][j]+=k;
		}
	}
}

\qquad 最后上一个完整代码

#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll tre[105][105],n,m;
inline ll lowbit(ll k){return k&(-k);}

// 将第 H 行,第 L 列的数加上 k 
inline modify(ll H,ll L,ll k){
	// 遍历行的 lowbit 
	for(ll i=H;i<=n;i+=lowbit(i)){
		// 遍历列的 lowbit 
		for(ll j=L;j<=m;j+=lowbit(j)){
			tre[i][j]+=k;
		}
	}
}

// 查询左上角在 第一行第一列,右下角在第 H 行第 L 列的矩阵之和
inline ll query(ll H,ll L){
	ll res=0;
	// 遍历行的 lowbit 
	for(ll i=H;i>=1;i-=lowbit(i)){
		// 遍历列的 lowbit
		for(ll j=L;j>=1;j-=lowbit(j)) {
			res+=tre[i][j];
		}
	}
	return res;
}

signed main(){
	ios::sync_with_stdio(false);
	cin>>n>>m;
	while(1){
		ll op,H,L,k;
		cin>>op>>H>>L;
		if(op==1){
			cin>>k;
			modify(H,L,k);
		}
		else cout<<query(H,L)<<endl;
	}
	return 0;
}

有不懂的私信我,我都会尽量回的。ok,讲完了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1859709.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MySQL集群高可用架构之双主双活+keepalived

该教程再linux系统下 从部署单台mysql -->到部署两台双主mysql-->再到安装keepalived-->整体测试 从而实现mysql双主双活高可用的目标。 改文档由本人亲自部署搭建一步一步编写而来&#xff0c;实属不易&#xff0c;如对您有所帮助&#xff0c;请收藏点个赞&#x…

装机必备一WinRAR安装使用以及常见问题

WinRAR是一款功能强大的压缩包管理器&#xff0c;支持多种压缩格式&#xff0c;如RAR、ZIP等。作为一款经典且广泛使用的压缩软件&#xff0c;WinRAR不仅在文件压缩率和速度方面表现出色&#xff0c;还提供了备份数据、缩减电子邮件附件大小以及解压缩网络下载文件等功能。 为…

瑜伽馆管理系统的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;管理员管理&#xff0c;教练管理&#xff0c;用户管理&#xff0c;瑜伽管理&#xff0c;套餐管理&#xff0c;体测报告管理&#xff0c;基础数据管理 前台账户功能包括&#xff1a;系统首页&#xff0…

计网入门还没到放弃

TCP报文段格式 源端口&#xff1a;标识报文的返回地址 目的端口&#xff1a;指明计算机上的应用程序接口 序号&#xff1a;通过SYN包传给接收端主机&#xff0c;每传送一次就1&#xff0c;用来解决网络包乱序的问题。 确认号&#xff1a;期望下一次收到的数据的序列号&#xff…

lvm,磁盘配额

文章目录 LVM概述Logical Volume Manager逻辑卷管理LVM机制的基本概念 LVM的管理命令LVM应用实例案例环境需求描述创建 LVM创建, 删除LVM 流程创建 LVM 流程删除 LVM 流程 磁盘配额概述实现磁盘限额的条件Linux 磁盘限额的特点 磁盘配额管理CentOS7设置磁盘配额步骤编辑用户和组…

61.指针和二维数组(1)

目录 一.回顾 二.思考 三.实验验证 四.视频教程 一.回顾 在一维数组中&#xff0c;一维数组的数组名就是一维数组中首个元素的地址。若有int a[5]&#xff1b;int *p&#xff1b;则p&a[0]可以简写成pa&#xff1b; 在C语言中&#xff0c;二维数组如int a[2][2]{1,2,3,4…

英语口语练习评测的开发实现

英语口语评测是一个复杂的系统&#xff0c;需要综合考虑语音识别、语音评测、自然语言处理等多种技术。以下是一些常见的英语口语评测开发框架。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合作。 基于语音识别的口语评测框架这种框架主要…

Python | Leetcode Python题解之第189题轮转数组

题目&#xff1a; 题解&#xff1a; def reverse(nums: List[int], left, right) -> None:i, j left, rightwhile i < j:nums[i], nums[j] nums[j], nums[i]i1j-1 class Solution:def rotate(self, nums: List[int], k: int) -> None:n len(nums)k % nreverse(num…

运行时库链接方式实践指南(MT、MD、MTd、MDd)

前言 笔者曾经编译一个库提供给使用者&#xff0c;提供库后发现由于运行时库连接方式不一致&#xff0c;导致使用者无法连接笔者提供的库。另一方面&#xff0c;理解和选择正确的运行时链接方式对于构建高效、可靠的应用程序至关重要。 因此&#xff0c;本文将展开运行时库的基…

web前端课程设计——农产品购物车

该课程设计使用的环境为:HTMLcssJavaScript,vue3,creat-vue脚手架工具&#xff0c;vscode编辑器 其中实现的功能为:购物车管理&#xff0c;商品展示。 1.购物车管理中包含对商品数量进行加减&#xff0c;对商品进行全选或反选操作&#xff0c;删除单个商品或批量删除商品。 …

C++ | Leetcode C++题解之第189题轮转数组

题目&#xff1a; 题解&#xff1a; class Solution { public:void reverse(vector<int>& nums, int start, int end) {while (start < end) {swap(nums[start], nums[end]);start 1;end - 1;}}void rotate(vector<int>& nums, int k) {k % nums.size…

Android AOSP 编译并烧录到Google Pixel4XL

简介 AOSP&#xff08;Android Open Source Project&#xff09;是Android系统的开源版本&#xff0c;任何人都可以下载、编译和修改。手头上有一台Pixel 4XL&#xff0c;尝试编译AOSP并将其烧录到的设备上。 准备工作 在开始之前&#xff0c;您需要确保您的电脑满足以下条件…

文旅景区科技馆增加5D影院项目VR游乐场

王屋山风景名胜区增加20座5D影院设备&#xff0c;5D影院不像普通电影院&#xff0c;5D影院座椅可以根据影片播放内容&#xff0c;进行实时摆动和各种特效&#xff0c;闪电&#xff0c;振臀振臂&#xff0c;泡泡等个种特效。影片内容可以进行定制&#xff0c;根据景区文化风光&a…

OnlyOffice-8.1版本深度测评

2024年6月19日&#xff0c;ONLYOFFICE 发布了最新版本 8.1&#xff0c;带来了超过30项新功能和432个 bug 修复。本文将详细评测该版本的新功能和改进&#xff0c;帮助用户全面了解这一升级带来的实际体验提升。 一、功能全面的 PDF 编辑器 PDF 是日常工作中不可或缺的文件格式…

Waiting for table flush故障处理

故障排查 1 找到正处于open状态的表 show open tables where in_use >1; 2 找到引发故障的慢查询 ① 找到阻塞flush tables的慢查询 SELECT * FROM information_schema.PROCESSLIST WHERE info IS NOT NULL AND state NOT LIKE ‘Waiting for table flush’ AND info …

CentOS7.6安装RabbitMQ

前言&#xff1a;因为RabbitMQ是ERlang语言编写所以要先安装ERlang再安装RabbitMQ 安装ERlang 借鉴前辈原文地址&#xff1a;https://www.cnblogs.com/fengyumeng/p/11133924.html 第一步&#xff1a;安装依赖 yum -y install gcc glibc-devel make ncurses-devel open…

Linux-CentOs7 基础配置

目录 一、安装ifconfig二、配置静态IP 一、安装ifconfig 查找ifconfig存在哪个包下 yum search ifconfig下载对应的资源包 yum install net-tools.x86_64检查是否安装成功 ifconfig二、配置静态IP 点击编辑 — 虚拟网络编辑器&#xff0c;选择VMnet8&#xff0c;点击NET设置&am…

【C++题解】1711. 输出满足条件的整数1

问题&#xff1a;1711. 输出满足条件的整数1 类型&#xff1a;简单循环 题目描述&#xff1a; 有这样的两位数&#xff0c;其十位上的数字比个位上的数字要大&#xff0c;且十位和个位上的数字之和为偶数&#xff0c;请找出所有的满足条件的 2 位数。 输入&#xff1a; 无。…

Hive基础知识(十九):Hive 自定义函数

1. 自定义函数 1&#xff09;Hive 自带了一些函数&#xff0c;比如&#xff1a;max/min 等&#xff0c;但是数量有限&#xff0c;自己可以通过自定义 UDF 来方便的扩展。 2&#xff09;当 Hive 提供的内置函数无法满足你的业务处理需要时&#xff0c;此时就可以考虑使用用户自…

山寨币大额解锁抛压拖累比特币:10X Research 深度剖析市场动荡

加密货币市场大幅下跌&#xff0c;山寨币损失惨重 在经历了几个月的强劲表现后&#xff0c;加密货币市场最近经历了一轮大幅下跌&#xff0c;特别是山寨币损失惨重。10X Research 最近在其Newsletter中发表了观点&#xff0c;认为山寨币大额解锁所带来的抛压正在拖累比特币。本…