当前位置: 首页 > news >正文

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;
}

相关文章:

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

树状数组 lowbit 在学习树状数组之前&#xff0c;我们需要了解lowbit操作&#xff0c;这是一种位运算操作&#xff0c;用于计算出数字的二进制表达中的最低位的1以及后面所有的0。 写法很简单&#xff1a; int lowbit&#xff08;int x&#xff09;&#xff5b;return x &am…...

[AIGC] 开源流程引擎哪个好,如何选型?

开源流程引擎是指一种自动化的工作流解决方案&#xff0c;它可以帮助你管理和协调你的业务流程和决策。但是&#xff0c;在开源世界里&#xff0c;有许多不同的流程引擎可以选择。因此&#xff0c;如何选择适合你的开源流程引擎&#xff0c;是一个具有挑战性和价值的话题。 文章…...

服务器使用过程中遇到常见故障及解决方案(包括蓝屏死机、无法删除的文件如何清理、网络卡、服务器连接不上等)

互联网时代&#xff0c;服务器的安全性和稳定性尤为重要&#xff0c;支撑着整个互联网行业的信息和数据安全。最近经常有客户咨询服务器的日常故障排除方法。由于服务器复杂的硬件结构和繁琐的运行原理&#xff0c;经常会出现这样那样的问题&#xff0c;有时即使是最小的问题也…...

【推荐算法】userid是否需要建模

看到一个din的源码&#xff0c;将userid也构建了emb table。 于是调研了一下。即推荐算法需要建模userid吗&#xff1f; 深度学习推荐算法中user-id和item-id是否需要放入模型中作为特征进行训练呢&#xff1f; 深度学习推荐算法中user-id和item-id是否需要放入模型中作为特…...

图解支付-金融级密钥管理系统:构建支付系统的安全基石

经常在网上看到某某公司几千万的个人敏感信息被泄露&#xff0c;这要是放在持牌的支付公司&#xff0c;可能就是一个非常大的麻烦&#xff0c;不但会失去用户的信任&#xff0c;而且可能会被吊销牌照。而现实情况是很多公司的技术研发人员并没有足够深的安全架构经验来设计一套…...

新概念英语第二册(58)

【New words and expressions】生词和短语&#xff08;16&#xff09; blessing n. 福分&#xff0c;福气 disguise n. 伪装 tiny adj. 极小的 possess v. 拥有 cursed …...

java和javascript的区别和联系

Java和JavaScript是两种非常流行的编程语言&#xff0c;尽管它们的名称相似&#xff0c;但实际上它们在设计、用途和运行环境等方面有很大的不同。以下是Java和JavaScript之间的主要区别和联系&#xff1a; 区别 设计目的和用途&#xff1a; Java 是一种通用的、面向对象的编程…...

uniapp中配置开发环境和生产环境

uniapp在开发的时候&#xff0c;可以配置多种环境&#xff0c;用于自动切换IP地址&#xff0c;用HBuilder X直接运行的就是开发环境&#xff0c;用HBuilder X发布出来的&#xff0c;就是生产环境。 1.使用HBuilder X创建原生的uniapp程序 选择vue3 2.什么都不改&#xff0c;就…...

prometheus之mysqld_exporter部署

mysql_exporter部署 下载解压压缩包 mkdir /opt/mysqld_exporter/ cd /opt/mysqld_exporter/ # 修改为自己的软件下载地址 wget http://soft.download/soft/linux/prometheus/mysqld_exporter/mysqld_exporter-0.14.0.linux-amd64.tar.gz tar -zxvf mysqld_exporter-0.14.0.…...

<网络安全>《19 安全态势感知与管理平台》

1 概念 安全态势感知与管理平台融合大数据和机器学习技术&#xff0c;提供可落地的安全保障能力&#xff0c;集安全可视化、监测、预警和响应处置于一体。它集中收集并存储客户I环境的资产、运行状态、漏洞、安全配置、日志、流量等安全相关数据&#xff0c;内置大数据存储和多…...

sqli靶场完结篇!!!!

靶场&#xff0c;靶场&#xff0c;一个靶场打一天&#xff0c;又是和waf斗智斗勇的一天&#xff0c;waf我和你拼啦&#xff01;&#xff01; 31.多个)号 先是一套基本的判断 &#xff0c;发现是字符型&#xff0c;然后发现好像他什么都不过滤&#xff1f;于是开始poc 3213131…...

堆结构的解读

对于数据结构堆来说&#xff0c;堆事一种特定的数据结构&#xff0c;其与二叉树非常类似&#xff0c;但是又与二叉树有所不同&#xff0c;其不同点在于堆不需要左右指针指向孩子节点&#xff0c;而给定一个数组&#xff0c;将数组中的元素进行特定排序之后&#xff0c;就可以得…...

7、Qt5开发及实列(笔记)

文章目录 第二章 Qt5模板库、工具类及控件2.2 容器类2.2.1 QList类 # 2.3 QVariant类 #2.4 算法及正则表达式2.5控件 第二章 Qt5模板库、工具类及控件 2.2 容器类 2.2.1 QList类 //2.2容器类 - QList类QList<QString> list;//声明了一个QList<QString>栈对象{QSt…...

FPGA_ip_Rom

一 理论 Rom存储类ip核&#xff0c;Rom是只读存储器的简称&#xff0c;是一种只能读出事先存储数据的固态半导体存储器。 特性&#xff1a; 一旦储存资料&#xff0c;就无法再将之改变或者删除&#xff0c;且资料不会因为电源关闭而消失。 单端口Rom: 双端口rom: 二 Rom ip核…...

5-3、S曲线生成器【51单片机+L298N步进电机系列教程】

↑↑↑点击上方【目录】&#xff0c;查看本系列全部文章 摘要&#xff1a;本节介绍步进电机S曲线生成器的计算以及使用 一.计算原理 根据上一节内容&#xff0c;已经计算了一条任意S曲线的函数。在步进电机S曲线加减速的控制中&#xff0c;需要的S曲线如图1所示&#xff0c;横…...

Google开源项目风格指南——Java

Google Java Style Guide 谷歌 Java 风格指南 谷歌 Java 风格指南1 简介1.1 术语说明1.2 指导说明 2 源文件基础知识2.1 文件名2.2 文件编码&#xff1a;UTF-82.3 特殊字符2.3.1 空白字符2.3.2 特殊转义序列2.3.3 非ASCII字符 3 源文件结构3.1 许可或版权信息&#xff08;如果存…...

数字图像处理与Python语言实现-常见图像特效(二)

文章目录 9、Splash滤镜10、双色调(Duo-Tone)滤镜11、日光(Daylight)滤镜12、60sTVs效果13、高对比度14、棕褐色/复古滤镜15、晕影效果16、模糊滤镜17、浮雕边缘9、Splash滤镜 在Splash滤镜中,仅某些颜色保持原样,其余颜色转换为灰度。 为了执行此操作,我们将在 HSV 颜…...

学习方法分享

工作上的代码实现&#xff0c;不要过度设计&#xff0c;不要想着炫技&#xff0c;要简单务实&#xff0c;“大道至简”。 学习一个方向&#xff08;模块化&#xff09;的知识&#xff0c;不经意间就会涉及到另一个领域&#xff0c;比如从消息队列存储的顺序读/写&#xff0c;延…...

Python学习路线 - Python高阶技巧 - 拓展

Python学习路线 - Python高阶技巧 - 拓展 闭包闭包注意事项 装饰器装饰器的一般写法(闭包写法)装饰器的语法糖写法 设计模式单例模式工厂模式 多线程进程、线程并行执行多线程编程threading模块 网络编程Socket客户端和服务端Socket服务端编程实现服务端并结合客户端进行测试 S…...

qt在pro文件中设置utf-8编码

在 Qt 的 .pro 文件中设置使用 UTF-8 编码&#xff0c;可以通过在 .pro 文件中添加以下内容来实现&#xff1a; QMAKE_CXXFLAGS -source-charset UTF-8 QMAKE_CXXFLAGS -execution-charset UTF-8这样设置后&#xff0c;Qt 会将源代码和执行时的字符集都设置为 UTF-8 编码。这…...

AI-调查研究-01-正念冥想有用吗?对健康的影响及科学指南

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持续更新中&#xff01;&#xff08;长期更新&#xff09; 目前2025年06月05日更新到&#xff1a; AI炼丹日志-28 - Aud…...

Vue记事本应用实现教程

文章目录 1. 项目介绍2. 开发环境准备3. 设计应用界面4. 创建Vue实例和数据模型5. 实现记事本功能5.1 添加新记事项5.2 删除记事项5.3 清空所有记事 6. 添加样式7. 功能扩展&#xff1a;显示创建时间8. 功能扩展&#xff1a;记事项搜索9. 完整代码10. Vue知识点解析10.1 数据绑…...

深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法

深入浅出&#xff1a;JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中&#xff0c;随机数的生成看似简单&#xff0c;却隐藏着许多玄机。无论是生成密码、加密密钥&#xff0c;还是创建安全令牌&#xff0c;随机数的质量直接关系到系统的安全性。Jav…...

【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力

引言&#xff1a; 在人工智能快速发展的浪潮中&#xff0c;快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型&#xff08;LLM&#xff09;。该模型代表着该领域的重大突破&#xff0c;通过独特方式融合思考与非思考…...

C# 类和继承(抽象类)

抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...

【配置 YOLOX 用于按目录分类的图片数据集】

现在的图标点选越来越多&#xff0c;如何一步解决&#xff0c;采用 YOLOX 目标检测模式则可以轻松解决 要在 YOLOX 中使用按目录分类的图片数据集&#xff08;每个目录代表一个类别&#xff0c;目录下是该类别的所有图片&#xff09;&#xff0c;你需要进行以下配置步骤&#x…...

Spring Boot+Neo4j知识图谱实战:3步搭建智能关系网络!

一、引言 在数据驱动的背景下&#xff0c;知识图谱凭借其高效的信息组织能力&#xff0c;正逐步成为各行业应用的关键技术。本文聚焦 Spring Boot与Neo4j图数据库的技术结合&#xff0c;探讨知识图谱开发的实现细节&#xff0c;帮助读者掌握该技术栈在实际项目中的落地方法。 …...

用docker来安装部署freeswitch记录

今天刚才测试一个callcenter的项目&#xff0c;所以尝试安装freeswitch 1、使用轩辕镜像 - 中国开发者首选的专业 Docker 镜像加速服务平台 编辑下面/etc/docker/daemon.json文件为 {"registry-mirrors": ["https://docker.xuanyuan.me"] }同时可以进入轩…...

USB Over IP专用硬件的5个特点

USB over IP技术通过将USB协议数据封装在标准TCP/IP网络数据包中&#xff0c;从根本上改变了USB连接。这允许客户端通过局域网或广域网远程访问和控制物理连接到服务器的USB设备&#xff08;如专用硬件设备&#xff09;&#xff0c;从而消除了直接物理连接的需要。USB over IP的…...

C++使用 new 来创建动态数组

问题&#xff1a; 不能使用变量定义数组大小 原因&#xff1a; 这是因为数组在内存中是连续存储的&#xff0c;编译器需要在编译阶段就确定数组的大小&#xff0c;以便正确地分配内存空间。如果允许使用变量来定义数组的大小&#xff0c;那么编译器就无法在编译时确定数组的大…...