【基础】线段树

超详解线段树(浅显易懂,几乎涵盖所有线段树类型讲解,匠心之作,图文并茂)-CSDN博客

建树

 
void bui(int id,int l,int r)//创建线段树,id表示存储下标,区间[L,r]
{if(l == r)//左端点等于右端点,即为叶子节点(区间长度为1),直接赋值即可{tr[id] = a[l];return ;}
// 否则将当前区间中间拆开成两个区间int mid = (l + r) / 2;//mid则为中间点,左儿子的结点区间为[l,mid],右儿子的结点区间为[mid + 1,r]bui(id * 2,l,mid); //递归构造左儿子结点bui(id * 2 + 1,mid + 1,r); //递归构造右儿子结点
// 左右两个区间计算完成以后
// 合并到当前区间tr[id] = min(tr[id * 2],tr[id * 2 + 1]);//更新父节点
}

区间查询

 
//id 表示树节点编号,l r 表示这个节点所对应的区间
//x y表示查询的区间
int find(int id,int l,int r,int x,int y)
{//需要查询的区间[x,y]将当前区间[l,r]包含的时候if(x <= l && r <= y) return tr[id];int mid = (l + r) / 2,ans = -INT_MAX;// 如果需要查询左半区间if(x <= mid) ans = min(ans,find(id * 2,l,mid,x,y));   // 如果需要查询右半区间if(y > mid) ans = min(ans,find(id * 2 + 1,mid + 1,r,x,y));return ans;
}

单点修改

找到点,修改了往回走

返回的路上沿路修改父节点


// id 表示树节点编号,l r 表示这个节点所对应的区间
// 将 a[x] 修改为 v
// 线段树单点更新void gexi(int id, int l, int r, int x, int v)
{
// 找到长度为 1 的区间才返回if (l == r){//这一棵子树的值变成了v//这棵子树大小为1//最终肯定是要实现区间修改的tr[id] = v;return;}//否则找到 x 在左区间或者右区间去更新int mid = (l + r) / 2;//[l,mid]if (x <= mid) gexi(id * 2, l, mid, x, v);// 需要修改的值在左区间//[mid+1,r]else gexi(id * 2 + 1, mid + 1, r, x, v);// 需要修改的值在右区间//依然是以区间中的最大值为例tr[id] = max(tr[id * 2], tr[id * 2 + 1]);
}

区间修改


void push_up(int id)
{sumv[id] = sumv[id * 2] + sumv[id * 2 + 1];
}
void push_down(int id,int l,int r)
{if(lazy[id])//如果id有lazy标记{int mid = (l + r) / 2;//[l,r]中每个a[x]加上值lazy[id]//lazy是差分
//sumv是区间和,要求的//左区间和右区间都加上lazy[id * 2] += lazy[id];//将它的左孩子的lazy加上它的lazylazy[id * 2 + 1] += lazy[id];//将它的右孩子的lazy加上它的lazysumv[id * 2] += lazy[id] * (mid - l + 1);//左孩子的Q+=它下放的Q*区间长度sumv[id * 2 + 1] += lazy[id] * (r - mid);lazy[id] = 0;//清空lazy标记}
}//钱将更新
void qjgx(int id,int l,int r,int x,int y,int v)//id:目前查到的节点编号  目前区间为[l,r]  目标是讲[x,y]的所有数+v
{if(l >= x && r <= y)//[l,r]被[x,y]包含了{lazy[id] += v;//暂时不下放Q,加进lazy标记中sumv[id] += v * (r - l + 1);//将Q收入囊中return ;}push_down(id,l,r);//要来更新下面节点了,赶紧下放Qint mid = (l + r) / 2;if(x <= mid) qjgx(id * 2,l,mid,x,y,v);//因为只有x<=mid(即[l,mid]有一部分是被[x,y]覆盖了的)才需要去更新[l,mid]if(y > mid) qjgx(id * 2 + 1,mid + 1,r,x,y,v);push_up(id);//子节点更新完之后父节点当然也要更新(上升操作)
}

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

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

相关文章

【图像处理与机器视觉】图像处理概述与像素

什么是数字图像处理 改善图像信息&#xff0c;便于作出解释 方便对图像传输&#xff0c;储存&#xff0c;方便机器理解 什么是数字图像 &#xff08;1&#xff09;模拟图像&#xff1a;连续二维函数 f&#xff08;x&#xff0c;y&#xff09;表示&#xff0c;其中 x&#xf…

操作系统真象还原:一些你可能正感到迷惑的问题

第0章-一些你可能正感到迷惑的问题 这是我看操作系统真象还原这本书的一些记录&#xff1a; 4 软件是如何访问硬件的 硬件在输入输出上大体分为串行和并行&#xff0c;相应的接口也就是串行接口和并行接口。串行硬件通过串行接口与 CPU 通信&#xff0c;反过来也是&#xff…

【uni-app】Pinia 持久化

小程序端 Pinia 持久化 说明&#xff1a;Pinia 用法与 Vue3 项目完全一致&#xff0c;uni-app 项目仅需解决持久化插件兼容性问题。 持久化存储插件 安装持久化存储插件&#xff1a; pinia-plugin-persistedstate pnpm i pinia-plugin-persistedstate插件默认使用 localStor…

MySQL——JDBC编程

目录 前言 一、JDBC概述 二、准备工作 1.下载MySQL的JDBC驱动包 2.把jar引入到项目中 三、JDBC编程 1.插入操作 2.查询操作 尾声 前言 本篇文章主要介绍如何利用Java代码进行操作数据库&#xff0c;在实际开发中&#xff0c;绝大多数对数据库的操作我们都是通过代码进行…

aop整理

一、aop基础知识 Spring AOP 详细深入讲解代码示例 二、spring/spring boot/spring cloud中出现的注解/类与概念的对应 Aspect&#xff1a; 标注当前MyAspect是一个切面类&#xff0c;–》对应切面的概念&#xff0c;在切面类中有用Before等注解修饰的方法作为advice,也有用…

uni-app全局弹窗的实现方案

背景 为了解决uni-app 任意位置出现弹窗 解决方案 一、最初方案 受限于uni-app 调用组件需要每个页面都引入注册才可以使用&#xff0c;此方案繁琐&#xff0c;每个页面都要写侵入性比较强 二、改进方案 app端&#xff1a;新建一个页面进行跳转&#xff0c;可以实现伪弹窗…

筛选的艺术:数组元素的精确提取

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、筛选的基本概念 二、筛选的实际应用案例 1. 筛选能被三整除的元素 2. 筛选小于特定值…

C++ list类

目录 0.前言 1.list介绍 1.1优势 1.2劣势 1.3容器属性 2.list使用 2.1构造函数 2.1.1默认构造函数 2.1.2填充构造函数 2.1.3范围构造函数 2.1.4拷贝构造函数 2.1.5初始化列表构造函数 2.2迭代器 2.2.1 begin() 2.2.2 end() 2.2.3 cbegin() 2.2.4 cend() 2.2.…

【C#】中托管与非托管对象区别、托管与非托管DLL区别

C 中的托管与非托管的区别_托管程序和非托管程序-CSDN博客 C# 中托管与非托管对象区别 在C#中&#xff0c;托管对象和非托管对象的主要区别在于内存管理和执行环境&#xff1a; 托管对象 (Managed Objects) 内存管理&#xff1a;托管对象的内存由.NET运行时&#xff08;CLR…

什么是CAS?

CAS&#xff08;比较并交换&#xff0c;Compare And Swap&#xff09;是一种多线程并发编程中的原子操作。它是一种乐观锁技术&#xff0c;用于解决 多线程环境下的数据竞争问题。CAS操作通过比较内存中的值与预期值是否相等来确定是否进行交换&#xff0c;如果相等&#xff0c…

PyMySQL连接池

背景 在用python写后端服务时候&#xff0c;需要与mysql数据库进行一些数据查询或者插入更新等操作。启动服务后接口运行一切正常&#xff0c; 隔了第二天去看服务日志就会报错&#xff0c;问题如下&#xff1a; pymysql.err.OperationalError: (2006, "MySQL server ha…

JavaScript-内存分配

内存空间 内存分为栈和堆 栈&#xff1a;由操作系统自动释放存放的变量值和函数值等。简单数据类型存放在栈中 栈会由低到高先入后出 堆&#xff1a;存储引用类型 &#xff08;对象&#xff09; 对象会先将数据存放在堆里面&#xff0c;堆的地址放在栈里面

关于virtualBox PC掉电后系统消失的解决方法

我们经常被会遇到笔记本电脑没电了&#xff0c;系统重新启动的情况。 这样会有出现虚拟机正在工作的时候&#xff0c;重启&#xff0c;导致虚拟机下次重启&#xff0c;系统出现问题。 直接上干货&#xff1a; 问题错误码 UUID {4105263a-f9d6-460e-b1e1-072377179af9} of the …

数字孪生智慧车站:全方位可视化管理平台

运用图扑数字孪生技术&#xff0c;智慧车站可视化管理平台实时模拟并监控车站运行状态&#xff0c;通过整合即时数据与历史数据&#xff0c;提供精准分析和预测。该平台支持乘客流量管理、设备运行监控、安全预警等多项功能&#xff0c;提高车站运营效率与安全性。直观的可视化…

N1 one-hot编码

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊# 前言 前言 onehot编码在机器学习比较常见&#xff0c;例如推荐系统中类别变量的处理等。 onehot 编码简介 One-hot编码&#xff08;one-hot encoding&…

进程发起DNS请求会fork进程吗

0 发起DNS请求本身并不会导致fork进程。当一个进程需要进行DNS解析时&#xff0c;它会使用操作系统提供的库函数&#xff08;如getaddrinfo、gethostbyname等&#xff09;发起DNS查询。这些库函数会通过网络接口向DNS服务器发送查询请求&#xff0c;并等待DNS服务器返回查询结…

这个橙子真的香!老司机徒手把玩香橙派Kunpeng Pro事后回忆录

说&#xff01;你是哪个门派&#xff1f; 香橙&#xff0c;芸香科柑橘属小乔木。枝通常有粗长刺&#xff0c;新梢及嫩叶柄常被疏短毛。叶厚纸质&#xff0c;翼叶倒卵状椭圆形&#xff0c;顶部圆或钝。。。 咦&#xff1f;小李&#xff1f;我们不是搞IT的嘛&#xff0c;怎么会有…

esp32s3 库函数功能解析

定时器 esp_restart 函数的主要功能是触发整个系统的重新启动。调用此函数后&#xff0c;ESP32 芯片会执行以下操作&#xff1a; 保存当前状态&#xff08;如果需要&#xff09;&#xff1a;在一些应用场景中&#xff0c;可能需要在重启前保存当前系统状态&#xff0c;比如日…

(函数)求一元二次方程的根(C语言)

一、运行结果&#xff1b; 二、源代码&#xff1b; # define _CRT_SECURE_NO_WARNINGS # include <stdio.h> # include <math.h>//声明函数&#xff1b; //判断条件等于0时&#xff1b; void zeor(double a, double b);//判断条件大于0时&#xff1b; void bigzeo…

浅谈 parallelStream和Stream 源码及其应用场景

上篇讲述了list.forEach()和list.stream().forEach() 异同点 谈到了并行流的概念&#xff0c;本篇则从源码出发&#xff0c;了解一下其原理。 一、流的初始操作流程 jdk8中 将Collection中加入了转换流的概念。 default Stream<E> stream() {return StreamSupport.str…