2 月 7 日算法练习- 数据结构-树状数组

树状数组

lowbit

在学习树状数组之前,我们需要了解lowbit操作,这是一种位运算操作,用于计算出数字的二进制表达中的最低位的1以及后面所有的0。
写法很简单:

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

这是利用了计算机存储整数的特性来写的,在计算机中整数都使用补码进行存储,原理不做深究,记住怎么写即可。

树状数组基础

树状数组是一种可以“动态求区间和”的树形数据结构,但并没有真正地构造出边来,所以是“树状”的。
基础的树状数组可以实现对区间和的单点修改和区间查询时间复杂度均为O(logn).
树状数组所需的东西非常简单,就一个数组int[N],大小和我们所需要维护的数组大小一样即可

先看下树状数组的结构:
其中t[i]存储a[]数组中一段区间的和,具体区间
怎么算呢?
我们定义是让t[i]存储以i结尾且区间大小为
lowbit(i)的区间的和。
∑ j = i − lowbit ( i ) + 1 i a i \sum_{j=i-\text{lowbit}(i)+1}^{i} a_i j=ilowbit(i)+1iai
我习惯于叫[i-lowbit(i)+1,i]为i的管辖区间。

怎么进行单点修改?
举个例子,假如我要修改a[3],让他加上x,在右边这个图中我们可以看出,我们应该修改
t3,t4和t8共3个节点。因为这三个节点的管辖区间内都包含3这个节点
但是我们如何从3开始,去找到3,4,8呢?
只需要进行+lowbit操作即可(二进制性质)。
3 + lowbit(3) = 4
4 + lowbit(4) = 8

在这里插入图片描述

怎么进行区间查询?
第一步我们将其拆为两个区间的差,举个例子,我们要查询区间[3,7]的和,就要拆分为sum[1,7] -sum[1,2],回想一下前缀和的写法~
现在问题变为如何查询[1,k]的和?
假如我们要求sum[1,7],我们从右图可以知道结果为t[7]+t[6]+t[4],这是怎么得到的呢?
通过-lowbit可:
7 - lowbit(7) = 6
6 - lowbit(6)= 4
在这里插入图片描述

于是我们可以直接得到树状数组最重要的两个函数update()和getprefix().
大功告成!

// 给 a[k] 增加 x
void update(int k, int x) {for (int i = k; i <= n; i += lowbit(i)) {t[i] += x;}
}// 返回区间 [1, k] 的和
int getprefix(int k) {int res = 0;for (int i = k; i > 0; i -= lowbit(i)) {res += t[i];}return res;
}

殷老师排队

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
思路:将式子转化,用树状数组模拟题意

#include<bits/stdc++.h>
using namespace std;
const int N = 1e5+9;
using ll = long long ;
ll a[N],t[N],n,m;
int lowbit(int x){return x&-x;
}void update(int k,int x){a[k] += x;for(int i=k;i<=n;i+=lowbit(i)){t[i] +=x;}
}ll getPrefix(int k){ll res =0;for(int i=k;i>0;i-=lowbit(i)){res+=t[i];}return res;
}ll getSum(int l,int r){return getPrefix(r) - getPrefix(l-1);
}int b(int i){return (2*i - n - 1)*a[i] - getSum(1, i-1) + getSum(i+1, n);
}int main( ){ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);cin>>n>>m;for(int i=1;i<=n;i++){int x;cin>>x;update(i,x);}while(m--){int op;cin>>op;if(op==1){int k,b;cin>>k>>b;update(k, -a[k]+b);}else{int i;cin>>i;cout<<b(i)<<'\n';}}return 0;
}

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

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

相关文章

2024.02.08

#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent) :QWidget(parent),ui(new Ui::Widget) {ui->setupUi(this);this->setWindowIcon(QIcon(":/zh.png"));ui->lineEdit->setPlaceholderText("账号/手…

WordPress Plugin HTML5 Video Player SQL注入漏洞复现(CVE-2024-1061)

0x01 产品简介 WordPress和WordPress plugin都是WordPress基金会的产品。WordPress是一套使用PHP语言开发的博客平台。该平台支持在PHP和MySQL的服务器上架设个人博客网站。WordPress plugin是一个应用插件。 0x02 漏洞概述 WordPress Plugin HTML5 Video Player 插件 get_v…

Python进阶--爬取美女图片壁纸(基于回车桌面网的爬虫程序)

目录 一、前言 二、爬取下载美女图片 1、抓包分析 a、分析页面 b、明确需求 c、抓包搜寻 d、总结特点 2、编写爬虫代码 a、获取图片页网页源代码 b、提取所有图片的链接和标题 c、下载并保存这组图片 d、 爬取目录页的各种类型美女图片的链接 e、实现翻页 三、各…

ZooKeeper安装及配置(Windows版)

步骤&#xff1a; 1.官网下载二进制版本ZooKeeper安装包。 2.解压到你要安装的目录下 3.配置 3.1进入目录 D:\Install\apache-zookeeper-3.9.1-bin 新增两个文件夹&#xff1a;data和log 3.2 进入目录D:\Install\apache-zookeeper-3.9.1-bin\conf 复制zoo_sample.cfg文件&a…

手把手教你开发Python桌面应用-PyQt6图书管理系统-主窗体点击菜单显示功能窗体实现

锋哥原创的PyQt6图书管理系统视频教程&#xff1a; PyQt6图书管理系统视频教程 Python桌面开发 Python入门级项目实战 (无废话版) 火爆连载更新中~_哔哩哔哩_bilibiliPyQt6图书管理系统视频教程 Python桌面开发 Python入门级项目实战 (无废话版) 火爆连载更新中~共计24条视频&…

【人工智能】人工智能 – 引领未来科技的潮流

写在前面 引言红利挑战结论 引言 人工智能是指使计算机系统表现出类似于人类智能的能力。其目标是实现机器具备感知、理解、学习、推理和决策等智能行为。人工智能的发展可以追溯到上世纪50年代&#xff0c;随着计算机技术和算法的不断进步&#xff0c;人工智能得以实现。 今天…

visual studio code could not establish connection to *: XHR failed

vscode远程连接服务器时&#xff0c;输入密码&#xff0c;又重新提示输入密码&#xff0c;就这样循环了好几次&#xff0c;然后会报上述的错误。由于我是window系统&#xff0c;我用cmd&#xff0c;然后ssh */你的IP地址/*发现可以远程到服务器上&#xff0c;但是通过Vscode就不…

向量搜索查询faiss、annoy

首先介绍annoy : 转发空间&#xff1a;https://download.csdn.net/blog/column/10872374/114665212 Annoy是高维空间求近似最近邻的一个开源库。 Annoy构建一棵二叉树&#xff0c;查询时间为O(logn)。 Annoy通过随机挑选两个点&#xff0c;并使用垂直于这个点的等距离超平面…

新书速览|PyTorch 2.0深度学习从零开始学

实战中文情感分类、拼音汉字转化、中文文本分类、拼音汉字翻译、强化学习、语音唤醒、人脸识别 01 本书简介 本书以通俗易懂的方式介绍PyTorch深度学习基础理论&#xff0c;并以项目实战的形式详细介绍PyTorch框架的使用。为读者揭示PyTorch 2.0进行深度学习项目实战的核心技…

Git介绍和常用命令说明

目录 一、Git概述 1.1 Git是什么 1.2 Git有什么用 1.3 Git仓库介绍 二、Git下载与安装 三、Git代码托管服务&#xff08;远程仓库&#xff09; 四、Git常用命令 4.1 设置用户信息 4.2 获取Git仓库 4.2.1 本地初始化Git仓库 4.2.2 从远程仓库克隆 4.3 本地仓库操作 …

相机图像质量研究(10)常见问题总结:光学结构对成像的影响--光圈

系列文章目录 相机图像质量研究(1)Camera成像流程介绍 相机图像质量研究(2)ISP专用平台调优介绍 相机图像质量研究(3)图像质量测试介绍 相机图像质量研究(4)常见问题总结&#xff1a;光学结构对成像的影响--焦距 相机图像质量研究(5)常见问题总结&#xff1a;光学结构对成…

SERVLET线程模型

1. SERVLET线程模型 Servlet规范定义了两种线程模型来阐明Web容器应该如何在多线程环境中处理servlet。第一种模型称为多线程模型,默认在此模型内执行所有servlet。在此模型中,每次客户机向servlet发送请求时Web容器都启动一个新线程。这意味着可能有多个线程同时访问servle…

机器人运动学林沛群——旋转矩阵

旋转矩阵 基本概念 三个主轴&#xff0c;可以看作是三个向量&#xff0c;为b在a的表达&#xff0c;以a为基准 旋转矩阵 B相对于A的姿态&#xff1a; B A R [ A X B ^ A Y B ^ A Z B ^ ] [ X ^ B ⋅ X ^ A Y ^ B ⋅ X ^ A Z ^ B ⋅ X ^ A X ^ B ⋅ Y ^ A Y ^ B ⋅ Y ^ A Z …

牛客网SQL264:查询每个日期新用户的次日留存率

官网链接&#xff1a; 牛客每个人最近的登录日期(五)_牛客题霸_牛客网牛客每天有很多人登录&#xff0c;请你统计一下牛客每个日期新用户的次日留存率。 有一个登录(login。题目来自【牛客题霸】https://www.nowcoder.com/practice/ea0c56cd700344b590182aad03cc61b8?tpId82 …

C语言笔试题之实现C库函数 strstr()(设置标志位)

实例要求&#xff1a; 1、请你实现C库函数strstr()&#xff08;stdio.h & string.h&#xff09;&#xff0c;请在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标&#xff08;下标从 0 开始&#xff09;&#xff1b;2、函数声明&#xff1a;int strStr(char* h…

5G NR 信道号计算

一、5G NR的频段 增加带宽是增加容量和传输速率最直接的方法&#xff0c;目前5G最大带宽将会达到400MHz&#xff0c;考虑到目前频率占用情况&#xff0c;5G将不得不使用高频进行通信。 3GPP协议定义了从Sub6G(FR1)到毫米波(FR2)的5G目标频谱。 其中FR1是5G的核心频段&#xff0…

米贸搜|Facebook在购物季使用的Meta广告投放流程

一、账户简化 当广告系列开始投放后&#xff0c;每个广告组都会经历一个初始的“机器学习阶段”。简化账户架构可以帮助AI系统更快获得广告主所需的成效。例如&#xff1a; 每周转化次数超过50次的广告组&#xff0c;其单次购物费用要低28%&#xff1b;成功结束机器学习阶段的…

MySQL索引怎么提高查询的速度?

目录 一、MySQL介绍 二、什么是索引 三、为什么要用索引 四、索引如何提高查询速度 一、MySQL介绍 MySQL是一个开源的关系型数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;它是目前最流行和广泛使用的数据库之一。MySQL由瑞典MySQL AB公司开发&#xff0c;并在…

NXP恩智浦电源管理芯片 PIMC VR5510 (配套S32G)芯片手册(I2C通信)-翻译版

文章目录 1. 基本概述2. 简化应用视图3. 特点4. 应用5. 订购信息6. 芯片内部区块视图7. Pin脚信息7.1 Pin 描述7.2 Pinning 8. 产品特性概述8.1 最大额定值8.2 电气特性8.3 操作范围8.4 热力范围8.5 EMC合规性8.6 功能状态图8.7 功能设备操作8.8 主要状态机8.9 深度故障安全状态…

帮写祝福、年味卡片,属于Mate X5 折叠屏手机的用户过年指南

怎样过一个舒心愉快的新年&#xff1f; 春运往返的漫漫旅途上&#xff0c;手机总是忠实陪伴我们打发那些无聊的时光——用Mate X5的悬停观影模式&#xff0c;相当于自带手机支架&#xff0c;解放你拿着零食的双手&#xff0c;旅途观影更快乐&#xff01; 同时&#xff0c;此模…