【算法】树状数组和线段树

文章目录

  • 一、树状数组
  • 二、线段树

一、树状数组

O ( l o g n ) O(logn) O(logn) :单点修改、区间查询

与前缀和的区别:

  1. 前缀和是离线的,每次动态修改原数组某个元素,都需要重新求一遍前缀和,因此单点修改是 O ( n ) O(n) O(n) 的,区间查询则是 O ( 1 ) O(1) O(1)
  2. 树状数组是在线的,单点修改和区间查询都是 O ( l o g n ) O(logn) O(logn)

设下标从 1 1 1 开始

//树状数组的定义
t[x] = a[x - lowbit(x) + 1, x]

区间查询:求一段区间和

int query(int x)//[1, x]区间和
{int res = 0;for(int i = x; i > 0; i -= lowbit(i)) res += t[i];return res;
}

单点修改:给某个数加上一个数

void add(int x, int v)//a[x] + v
{for(int i = x; i <= n; i += lowbit(i)) t[i] += v;
}

lowbit

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

二、线段树

线段树是一种二叉树,可以 O ( l o g n ) O(logn) O(logn) 维护区间的某种属性比如:区间和、区间最值

//线段树的定义
struct node
{int l, r, v;  
}t[4 * N];//设根结点为1
//结点u的左孩子是2 * u,右孩子是2 * u + 1

下面以维护区间和为例:

树状数组能做的,线段树都能做,比如单点修改、区间查询

后序遍历建树

int a[N];//原数组void build(int u, int l, int r)
{t[u] = {l, r};if(l == r){t[u].v = a[l];return;}int mid = (l + r) / 2;build(2 * u, l, mid);build(2 * u + 1, mid + 1, r);pushup(u);
}

区间查询:求一段区间和

int query(int u, int l, int r)
{if(t[u].l >= l && t[u].r <= r) return t[u].v;int mid = (t[u].l + t[u].r) / 2;int res = 0;if(l <= mid) res += query(2 * u, l, r);if(r > mid) res += query(2 * u + 1, l, r);return res;
}

单点修改:给某个数加上一个数

void modify(int u, int x, int v)//a[x] + v
{if(t[u].l == t[u].r){t[u].v += v;return;}int mid = (t[u].l + t[u].r) / 2;if(x <= mid) modify(2 * u, x, v);else modify(2 * u + 1, x, v);pushup(u);
}

pushup

void pushup(int u)
{t[u].v = t[2 * u].v + t[2 * u + 1].v;
}

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

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

相关文章

RK3568平台开发系列讲解(实验篇)用户空间和内核空间数据交换

🚀返回专栏总目录 文章目录 一、用户空间和内核空间数据交换二、实验驱动代码三、应用测试代码沉淀、分享、成长,让自己和他人都能有所收获!😄 一、用户空间和内核空间数据交换 内核空间和用户空间的内存是不能互相访问的。但是很多应用程序都需要和内核进行数据的交换,…

【AI视野·今日NLP 自然语言处理论文速览 第七十八期】Wed, 17 Jan 2024

AI视野今日CS.NLP 自然语言处理论文速览 Wed, 17 Jan 2024 (showing first 100 of 163 entries) Totally 100 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Computation and Language Papers Deductive Closure Training of Language Models for Coherence, Accur…

Mamba-UNet:用于医学图像分割的类似UNet的纯视觉Mamba网络

文章目录 摘要1、引言2、方法2.1、架构概述2.2、VSS 块2.3、编码器2.4、解码器2.5、瓶颈和跳跃连接3、实验与结果3.1、数据集3.2、实现细节3.3、基准方法3.4、评估指标3.5、定性结果3.6、定量结果4、结论摘要 在医学图像分析的最新进展中,卷积神

【手写数据库toadb】数据字典缓存的实现方法和接口分享,面向对象设计思想,接口单一化

412数据字典的缓存 ​专栏内容: 手写数据库toadb 本专栏主要介绍如何从零开发,开发的步骤,以及开发过程中的涉及的原理,遇到的问题等,让大家能跟上并且可以一起开发,让每个需要的人成为参与者。 本专栏会定期更新,对应的代码也会定期更新,每个阶段的代码会打上tag,方便…

优化策略模式,提高账薄显示的灵活性和扩展性

接着上一篇文章&#xff0c;账薄显示出来之后&#xff0c;为了提高软件的可扩展性和灵活性&#xff0c;我们应用策略设计模式。这不仅仅是为了提高代码的维护性&#xff0c;而是因为明细分类账账薄显示的后面有金额分析这个功能&#xff0c;从数据库后台分析及结合Java语言特性…

2023年中国网络安全产业发展态势

文章目录 前言一、需求依然增长,市场竞争加剧二、产业增速放缓,融资市场降温三、产业结构变革,优化整合途径(一)电信运营商快速入场,互联网厂商加速网络安全领域布局。(二)网络安全商业模式在发生变化,网络安全运营服务、托管服务模式正在逐渐被客户认同。(三)国内安…

gorm day7

gorm day7 gorm Belongs To关系gorm Has One关系 gorm Belongs To关系 在看文档之前先进行一些基本概念的学习&#xff1a; 什么是主键&#xff1f;&#xff08;Primary Key) 主键是一个表中的特定列&#xff08;或一组列&#xff09;&#xff0c;用来唯一标识表中的每一行记…

每日一个脚本之一键部署Docker

每日一个shell脚本之一键部署Docker 源码参上 #!/usr/bin/bash # **************************************# CSDN: M乔木 # qq邮箱: 2776617348qq.com # 解释器: 这是一个shell脚本 # *************************…

1.合唱队形

Problem: 1.合唱队形 文章目录 思路解题方法复杂度Code 思路 这是一个动态规划问题。我们可以通过两次动态规划来解决这个问题。首先&#xff0c;我们从左到右进行动态规划&#xff0c;计算出每个位置的最长递增子序列长度。然后&#xff0c;我们从右到左进行动态规划&#xff…

2024幻兽帕鲁服务器创建教程_阿里PK腾讯超简单

幻兽帕鲁官方服务器不稳定&#xff1f;自己搭建幻兽帕鲁服务器&#xff0c;低延迟、稳定不卡&#xff0c;目前阿里云和腾讯云均推出幻兽帕鲁专用服务器&#xff0c;腾讯云直接提供幻兽帕鲁镜像系统&#xff0c;阿里云通过计算巢服务&#xff0c;均可以一键部署&#xff0c;鼠标…

vscode 提取扩展时出错。XHR failed

检查 vscode 设置中的代理服务器&#xff0c;位置如下图 清空 vocode 中的 Proxy&#xff0c;我黄线框的部分&#xff0c;内容清空。 检查电脑系统环境变量&#xff0c;是否设置了 http_proxy 和 https_proxy&#xff0c;如果有设置&#xff0c;则删除这两项&#xff0c;下载完…

leetcode 102.二叉树的层序遍历

这道题讲的就是对于树的数据结构的考察&#xff0c;这里用了一个比较常用的容器就是队列。 思路&#xff1a;首先我们知道&#xff0c;层序遍历也就是广度优先遍历的一种变形而已&#xff0c;既然我们知道广度优先搜索&#xff0c;就应该知道用队列进行辅助输出。 当根节点是…

树莓派4B(Raspberry Pi 4B)使用docker搭建nacos集群

树莓派4B&#xff08;Raspberry Pi 4B&#xff09;使用docker搭建nacos集群 由于国内访问不了docker hub&#xff0c;我选用的国内适配树莓派ARM架构的nacos镜像——centralx/nacos-server。本文涉及到docker compose和docker network方面的知识&#xff0c;基于nacos 2.0.4&am…

《区块链公链数据分析简易速速上手小册》第4章:交易数据分析(2024 最新版)

文章目录 4.1 解析交易输入和输出4.1.1 基础知识4.1.2 重点案例&#xff1a;追踪比特币交易4.1.3 拓展案例 1&#xff1a;以太坊交易的输入输出解析拓展案例1&#xff1a;以太坊交易的输入输出解析步骤1: 连接到以太坊网络步骤2: 获取交易数据步骤3: 解析交易输入结论 4.1.4 拓…

LLM大模型相关问题汇总---包括问题与答案

一、基础篇 1. 目前主流的开源模型体系有哪些&#xff1f; - Transformer体系&#xff1a;由Google提出的Transformer模型及其变体&#xff0c;如BERT、GPT等。 - PyTorch Lightning&#xff1a;一个基于PyTorch的轻量级深度学习框架&#xff0c;用于快速原型设计和实验…

Uipath 调用Python 脚本程序详解

Python 活动概述 UiPath.Python.Activities 是一个新的活动包&#xff0c;创建它是为了支持直接从工作流运行 Python 脚本和方法。 其包含以下活动&#xff1a; Python 作用域(Python Scope) - 为 Python 活动提供作用域的容器。 加载 Python 脚本(Load Python Script) - 将 P…

A股上市以来涨幅排行榜

一、统计数据说明 1. 涨幅排行榜是根据股价的后复权价格计算的&#xff0c;该价格考虑了分红送股拆股等事件对股价的影响&#xff0c;相当于是分红再投资的股价。 2. 年化投资收益率&#xff0c;是根据IPO收盘价至今涨幅计算的复合年化收益率。例如&#xff0c;假设一个股票上…

中国电子学会2023年12月份青少年软件编程Scratch图形化等级考试试卷四级真题(含答案)

2023-12 Scratch四级真题 分数&#xff1a;100 题数&#xff1a;24 分数&#xff1a;60min 一、单选题(共10题&#xff0c;共30分) 1.运行下列程序&#xff0c;输入“abcdef”&#xff0c;程序结束后&#xff0c;变量“字符串”是&#xff1f;&#xff08;B&#xff09;(3…

代码随想录刷题笔记 DAY 26 | 组合总和 No.39 | 组合求和 II No.40 | 分割回文串 No.131

文章目录 Day 2501. 组合总和&#xff08;No. 39&#xff09;1.1 题目1.2 笔记1.3 代码 02. 组合求和 II&#xff08;No. 40&#xff09;2.1 题目2.2 笔记2.3 代码 03. 分割回文串&#xff08;No. 131&#xff09;3.1 题目3.2 笔记3.3 代码 Day 25 01. 组合总和&#xff08;No…

re:从0开始的CSS之旅 16. 高度塌陷问题

1. 高度塌陷问题 高度塌陷问题&#xff1a;在文档流中&#xff0c;父元素的高度默认是被子元素撑开的&#xff0c;子元素多高&#xff0c;父元素就多高。 但是当子元素设置浮动后&#xff0c;我们发现子元素在页面中的位置没变&#xff0c;但是父元素的高度却塌陷了&#xff0…