树状数组算法

news2024/11/13 15:23:30

文章目录

  • 树状数组是什么
  • 树状数组与线段树的区别与联系
  • 树状数组讲解
    • 点修,区查,讲解及模板
    • 点查,区修讲解及模板

树状数组是什么

树状数组是一种数据结构,提供O(logn)时间内的单点修改和区间求和操作,比线段树有更优的常数因子。它利用二进制特性进行快速更新和查询,常见于数组操作问题。文章通过代码示例解释了树状数组的核心操作和单点修改、区间查询的实现原理。

树状数组与线段树的区别与联系

1.两者在复杂度上同级, 但是树状数组的常数明显优于线段树, 其编程复杂度也远小于线段树.

2.树状数组的作用被线段树完全涵盖, 凡是可以使用树状数组解决的问题, 使用线段树一定可以解决, 但是线段树能够解决的问题树状数组未必能够解决.

3.树状数组的突出特点是其编程的极端简洁性, 使用lowbit技术可以在很短的几步操作中完成树状数组的核心操作,其代码效率远高于线段树。

树状数组讲解

学树状数组之前要先知道lowbit函数
lowbit这个函数的功能就是求某一个数的二进制表示中最低的一位1,举个例子,x = 6,它的二进制为110,那么lowbit(x)就返回2,因为最后一位1表示2
lowbit函数要自己写 c++库里面没有 代码如下

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

看下图我们会发现,数组的下标其实是有规律的,就比如下标为1,3,5,7的二进制最后一位1都是20 为第0层 ,下标为2,6的二进制最后一位1都是21 为第1层,下标为4的二进制最后一位1都是22 为第2层,下标为8的二进制最后一位1都是23 为第3层,这样我们就可以找到一定的规律构造s数组
在这里插入图片描述
s数组对本身数组区间求和有很大的帮助,下图change函数就是构建s数组的过程,query函数就是求前缀和的函数
在这里插入图片描述

点修,区查,讲解及模板

点修和区查的意思就如下图所示
在这里插入图片描述
就比如他给你一个数组个数为n
在输入数组时,咱们也把s数组构建好
然后她再给你一个下标x,和一个数y让你执行操做1,就可以执行这样的操作 change(x,y) 就可以了
如果给你两个下标让你求区间和就可以执行query(y)-query(x)
例题链接
代码如下

#include <bits/stdc++.h>
#define lowbit(x) ((x)&(-x))
#define int long long
#define endl '\n'
#define PII pair<int,int> 
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
using namespace std;
int a[500100],m,n; 
void asd(int x,int y)
{
	while(x<=n)
	{
		a[x]+=y;
		x+=lowbit(x); 
	}
}
int sum(int x)
{
	int t=0;
	while(x)
	{
		t+=a[x];
		x-=lowbit(x); 
	}
	return t;
}
signed main()
{
	IOS
	int c;
	cin>>n>>m;
	for(int i=1;i<=n;i++)
	{
		cin>>c;
		asd(i,c);
	}
	while(m--)
	{
		int b,x,y;
		cin>>b>>x>>y;
		if(b==1)
		asd(x,y);
		else
		cout<<sum(y)-sum(x-1)<<endl; 
	}
	return 0;
}

点查,区修讲解及模板

点查和区修的意思如下
在这里插入图片描述
首先想学会这个需要先知道差分
不知道差分的点这里
看完下边就理解了
在输入数组时,咱们也把差分的s数组构建好
如果给你两个下标让你执行操作2就可以这样操作change(l,x) change(r,-x)
然后她再给你一个下标x,让你执行操做2,就可以执行这样的操作query(x)
例题链接
代码如下

#include <bits/stdc++.h>
#define lowbit(x) ((x)&(-x))
#define int long long
#define endl '\n'
#define PII pair<int,int> 
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
using namespace std;
int m,n,a[500100];
void asd(int x,int y)
{
	while(x<=n)
	{
		a[x]+=y;
		x+=lowbit(x);
	}
}
int sum(int x)
{
	int t=0;
	while(x)
	{
		t+=a[x];
		x-=lowbit(x);
	}
	return t;
}
signed main()
{
	IOS
	int c=0,d;
	cin>>m>>n;
	for(int i=1;i<=m;i++)
	{
		cin>>d;
		asd(i,d-c);
		c=d; 
	}
	for(int i=1;i<=n;i++)
	{
		int b,x,y,t;
		cin>>b;
		if(b==1)
		{
			cin>>x>>y>>t;
			asd(x,t);
			asd(y+1,-t);
		}
		else
		{
			cin>>x;
			cout<<sum(x)<<endl;
		}
	}
	return 0;
}

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

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

相关文章

语音控制开关的语音识别ic芯片方案

语音控制开关是一种基于语音识别技术的设备&#xff0c;它通过内置的语音识别芯片&#xff0c;将用户的语音指令转化为电信号&#xff0c;从而实现对设备的控制。例如在智能家居设备上的应用&#xff0c;通常需要连接到家庭的Wi-Fi网络上&#xff0c;以便与智能手机或智能音箱等…

openjdk11 jvm视角查看java线程异常退出synchronized锁自动释放

##synchronized锁异常 java代码demo public class ThreadTest {public int mul 1;public static void main(String[] args) {ThreadTest threadTest new ThreadTest();Thread yym_user_thread1 new Thread() {public void run() {System.out.println("yym_user_thread…

【C++题解】1147. 求1/1+1/2+2/3+3/5+5/8+8/13+13/21……的前n项的和

欢迎关注本专栏《C从零基础到信奥赛入门级&#xff08;CSP-J&#xff09;》 问题&#xff1a;1147. 求1/11/22/33/55/88/1313/21……的前n项的和 类型&#xff1a;函数 题目描述&#xff1a; 求1/11/22/33/55/88/1313/2121/34…的前 n 项的和。 输入&#xff1a; 输入一个…

WPF—路由事件详解

WPF—路由事件 路由事件是一种可以针对元素树中的多个侦听器而不是仅仅针对引发该事件的对象调用处理程序的事件。路由事件是一个CLR事件。 路由事件与一般事件的区别在于&#xff1a;路由事件是一种用于元素树的事件&#xff0c;当路由事件触发后&#xff0c;它可以向上或向…

C++ | Leetcode C++题解之第371题两整数之和

题目&#xff1a; 题解&#xff1a; class Solution { public:int getSum(int a, int b) {while (b ! 0) {unsigned int carry (unsigned int)(a & b) << 1;a a ^ b;b carry;}return a;} };

微程序控制器的设计

目录 一、微程序控制器的原理 1.模仿高级语言思想到微程序&#xff1a; 2.采用存储程序思想到CU内构造&#xff1a; 3.微程序执行过程&#xff1a; 二、微指令的设计 1.前置概念&#xff1a; 相容性微命令&#xff1a; 互斥性微命令&#xff1a; 2.微指令格式 水平…

作者推荐 |【Redis技术进阶之路】「技术提升系列」夯实基础分析探究ziplist压缩列表的点点滴滴

揭秘高效存储模型与数据结构底层实现 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 压缩列表&#xff08;ziplist&#xff09;压缩列表使用目的压缩列表结构组成压缩列表的各个组成部分三个…

flv格式分析与解复用

介绍 FLV(Flash Video)是Adobe公司推出的⼀种流媒体格式&#xff0c;由于其封装后的⾳视频⽂件体积⼩、 封装简单等特点&#xff0c;⾮常适合于互联⽹上使⽤。⽬前主流的视频⽹站基本都⽀持FLV。采⽤FLV 格式封装的⽂件后缀为.flv。 FLV封装格式是由⼀个⽂件头(file header)和 …

0基础深度学习项目13:基于TensorFolw实现天气识别

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 目录 一、创建环境二、前期准备2.1 设置GPU2.2 导入数据2.3 数据预处理2.3.1 加载数据2.3.2 查看图像的标签 2.4 数据可视化 三、构建简单的CNN网络&#xff0…

NVDLA专题12:具体模块介绍——RUBIK

概述 RUBIK类似于BDMA&#xff0c;它无需任何数据计算对数据映射格式进行转换。RUBIK有3种工作模式&#xff0c;分别是: 合并(Contract)数据立方体将特征数据立方体分割为多平面&#xff08;multi-planar&#xff09;格式将多平面(multi-planar)格式合并到数据立方体 由于该…

第三十八篇-TeslaP40-SenseVoice部署,速速杠杠的

环境 系统&#xff1a;CentOS-7 CPU: 14C28T 内存&#xff1a;32G 显卡&#xff1a;Tesla P40 24G 驱动: 535 CUDA: 12.2创建环境 conda create -n sv python3.11 -y conda activate sv克隆 git clone https://github.com/FunAudioLLM/SenseVoice.git cd SenseVoice配置镜像…

React antd Table表格动态合并单元格

注意&#xff1a; ① 采用的是React antDsign 4.x版本 ② 需重新处理data数据 实现效果 代码实现 import React from react; import { Table } from antd;const data [{key: 0,name: 张三,age: 22,sex: 男,},{key: 1,name: 李四,age: 42,sex: 男,},{key: 2,name: 小丽,age: …

CAN的协议层介绍

一&#xff0c;CAN帧种类介绍 1. 数据帧&#xff08;Data Frame&#xff09;&#xff1a;数据帧是CAN总线上用于传输用户数据的帧&#xff0c;包括必要的帧头、标识符、控制位、数据长度代码、数据域、CRC校验码和应答域等部分&#xff0c;是CAN通信中最基本和最重要的帧类型。…

Android Room DataBase

Room数据库是在Sqlite的基础上&#xff0c;进行了封装和优化。这让我们可以摆脱&#xff0c;繁琐的数据库操作 在module的gradle里面&#xff0c;加入: dependencies {annotationProcessor "androidx.room:room-compiler:2.3.0"implementation androidx.room:room-…

Selenium自动化测试 常见API的使用

本篇文章内容是关于 Selenium 自动化测试工具的常见 API 的使用 Selenium版本&#xff1a;4.23.1 编程语言&#xff1a;Java JDK22 编译器&#xff1a;IDEA 2024.2.0.2 浏览器版本&#xff1a;谷歌浏览器128.0.6613.36&#xff08;正式版本&#xff09; &#xff08;64 位&…

【Hexo】hexo-butterfly主题添加装备展示页面

本文首发于 ❄️慕雪的寒舍 在翻开往的时候看到了一位老哥的博客里面正好有这个教程&#xff0c;整了一下发现效果还不错&#xff01; Hexo的Butterfly魔改教程&#xff1a;我的装备&#xff0c;分享你在用的设备 | 张洪HeoHexo博客添加自定义css和js文件 | Leonus 注&#x…

Python个人收入影响因素模型构建:回归、决策树、梯度提升、岭回归|数据分享...

全文链接&#xff1a;https://tecdat.cn/?p37423 分析师&#xff1a;Greata Xie “你的命运早在出生那一刻起便被决定了。”这样无力的话语&#xff0c;无数次在年轻人的脑海中回响&#xff0c;尤其是在那些因地域差异而面临教育资源匮乏的年轻人中更为普遍。在中国&#xff0…

NRC-SIM:基于Node-RED的多级多核缓存模拟器

整理自&#xff1a; 《NRC-SIM: A NODE-RED Based Multi-Level, Many-Core Cache Simulator》&#xff0c;由 Ezequiel Trevio 撰写&#xff0c;作为他在德克萨斯大学里奥格兰德河谷分校攻读电气工程硕士学位的部分成果。以下是论文的详细主要内容&#xff1a; 摘要(Abstract…

全网最适合入门的面向对象编程教程:37 Python常用复合数据类型-列表和列表推导式

全网最适合入门的面向对象编程教程&#xff1a;37 Python 常用复合数据类型-列表和列表推导式 摘要&#xff1a; 在 Python 中&#xff0c;列表是一个非常灵活且常用的复合数据类型。它允许存储多个项&#xff0c;这些项可以是任意的数据类型&#xff0c;包括其他列表。列表推…

大话MoE混合专家模型

MoE&#xff08;Mixture of Experts&#xff09;&#xff0c;专家混合&#xff0c;就像是人工智能界的超级团队。想象一下&#xff0c;每个专家都有自己的拿手好戏&#xff0c;比如医疗问题找医生&#xff0c;汽车故障找机械师&#xff0c;做饭找大厨。MoE也是这样&#xff0c;…