线段树求区间最值问题

引言

今天主要还是练了两道题,是有关线段树如何去求一个区间内的最值问题的,我们可以用线段树来解决。

对应一个无法改变顺序的数组,我们想要去求一个区间内的最值,假设有n个结点,m次询问,暴力的解决办法的时间复杂度为O(m*n),当结点的个数很大时,对时间的花销太大了,因此我们可以考虑用线段树来解决问题,时间复杂度仅为O(m*logn),也许仅这样看你看不出来线段树的优势,换句话说,要查一个区间长度为40亿的区间,仅需要不到33次就可以查完

因此,我们今天的主题就是如何用线段树来解决区间内的最值问题(最大值,最小值)

例题

1.求区间内的最小值

P1816 忠诚

思路:对于这种区间问题,我们在建树方面就会有所不同,我们首先在建树的时候,sum中指的不在是区间中的权值,而是区间中的最值,对于某个结点,我们的sum中存储的就是这个区间里面的最值

然后在查区间的时候也会有所不同,我们需要判断区间是否在左子树或者右子树,以及处理区间在左右子树都有重叠位置

#include<bits/stdc++.h>
using namespace std;
#define int long long
int n,m;
int num[100005];
int x,y;
struct node{int l;int r;int sum;
}tree[100005*4];void build(int i,int l,int r)
{tree[i].l=l,tree[i].r=r;if(l==r){tree[i].sum=num[l];return ;}int mid=(l+r)/2;build(i*2,l,mid);build(i*2+1,mid+1,r);tree[i].sum=min(tree[i*2].sum,tree[i*2+1].sum);//存储子树中最小的那个return ;
}int find(int i,int l,int r)
{if(tree[i].l>=l&&tree[i].r<=r){return tree[i].sum;}int mid=(tree[i].l+tree[i].r)/2;if(mid>=r)//处于左子树{return find(i*2,l,r);} if(mid<l)//处于右子树{return find(i*2+1,l,r);}return min(find(i*2,l,mid),find(i*2+1,mid+1,r));//两边都有涉及
}signed main()
{cin>>n>>m;for(int i=1;i<=n;i++){cin>>num[i];}build(1,1,n);for(int i=1;i<=m;i++){cin>>x>>y;cout<<find(1,x,y)<<" ";}return 0;
} 

2.求区间内的最大值

P1531 I Hate It

思路:很明显的单点修改的线段树的求区间最大值问题,我们在修改单点最大值的时候也要回退去修改其余相关区间内的最大值,查询和建树和上面的那个最小值差不多

#include<bits/stdc++.h>
using namespace std;
#define int long long
int n,m;
int num[200005];
char s;
int a,b;
struct node{int l;int r;int sum;
}tree[200005*4];void build(int i,int l,int r)
{tree[i].l=l,tree[i].r=r;if(l==r){tree[i].sum=num[l];return ;}int mid=(l+r)/2;build(i*2,l,mid);build(i*2+1,mid+1,r);tree[i].sum=max(tree[i*2].sum,tree[i*2+1].sum);return ;
}void add(int i,int dis,int k)
{if(tree[i].l==tree[i].r){tree[i].sum=k;return ;}int mid=(tree[i].l+tree[i].r)/2;if(mid>=dis){add(i*2,dis,k);}else{add(i*2+1,dis,k);}tree[i].sum=max(tree[i*2].sum,tree[i*2+1].sum);return ;
}int find(int i,int l,int r)
{if(tree[i].l>=l&&tree[i].r<=r){return tree[i].sum;}int mid=(tree[i].l+tree[i].r)/2;if(r<=mid){return find(i*2,l,r);}if(l>mid){return find(i*2+1,l,r);}return max(find(i*2,l,mid),find(i*2+1,mid+1,r));
}
signed main()
{cin>>n>>m;for(int i=1;i<=n;i++){cin>>num[i];}build(1,1,n);for(int i=1;i<=m;i++){cin>>s;cin>>a>>b;if(s=='Q'){cout<<find(1,a,b)<<"\n";}else{if(num[a]<b){num[a]=b;add(1,a,b);}}}return 0;
}

总结 

线段树去求区间最值问题,一般用于区间内的数没有顺序,不能使用二分的时候可以考虑使用线段树来求最值问题,时间复杂度在查询和修改的时候也为O(logN)可以很大节约时间开销

同时在其中建树的时候也是有讲究的,其中的sum为区间内的最值

建树代码

求区间最大值:

void build(int i,int l,int r)
{tree[i].l=l,tree[i].r=r;if(l==r){tree[i].sum=num[l];return ;}int mid=(l+r)/2;build(i*2,l,mid);build(i*2+1,mid+1,r);tree[i].sum=max(tree[i*2].sum,tree[i*2+1].sum);return ;
}

求区间最小值:

void build(int i,int l,int r)
{tree[i].l=l,tree[i].r=r;if(l==r){tree[i].sum=num[l];return ;}int mid=(l+r)/2;build(i*2,l,mid);build(i*2+1,mid+1,r);tree[i].sum=min(tree[i*2].sum,tree[i*2+1].sum);return ;
}

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

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

相关文章

51、基于主成分分析和聚类分析的基因表达分析(matlab)

1、主成分分析和聚类分析简介 主成分分析(Principal Component Analysis, PCA)和聚类分析(Cluster Analysis)是两种常用的数据分析方法,用于降维和数据分类。 1)主成分分析(PCA) 主成分分析是一种常用的多元统计数据分析方法,旨在通过找到数据中最重要的变量(主成…

股票分析-20240628

今日关注&#xff1a; 20240626 六日涨幅最大: ------1--------300386--------- 飞天诚信 五日涨幅最大: ------1--------300386--------- 飞天诚信 四日涨幅最大: ------1--------300386--------- 飞天诚信 三日涨幅最大: ------1--------300386--------- 飞天诚信 二日涨幅最…

基于go-gmsm静态库编写的SM2椭圆曲线公钥密码算法PHP扩展 相较于openssl-ext-sm2编译更方便 增加了密文指定排序、识别ans1编码等功能

go-ext-sm2 介绍 基于go-gmsm静态库编写的SM2椭圆曲线公钥密码算法PHP扩展 相较于openssl-ext-sm2编译更方便 增加了密文指定排序、识别ans1编码等功能 特性:非对称加密 git地址:https://gitee.com/state-secret-series/go-ext-sm2.git 软件架构 zend 常规PHP扩展结构 …

vue-org-tree搜索到对应项高亮展开

效果图&#xff1a; 代码&#xff1a; <template><div class"AllTree"><el-form :inline"true" :model"formInline" class"demo-form-inline"><el-form-item><el-input v-model"formInline.user&quo…

c++ using namespace std的作用及注意事项

在C中&#xff0c;using namespace std; 是一个常见的指令&#xff0c;它用于简化标准库&#xff08;Standard Library&#xff09;中类和函数的引用。下面我将详细解释这个指令的作用和使用时的注意事项。 作用 在c/c标准库中&#xff0c;许多类和函数的定义都在std(standar…

【Git】远程仓库操作

创建远程仓库 在官网进行注册登录&#xff1a;Gitee或Github 进入后点击新建仓库&#xff0c;默认选项创建即可 **仓库创建完成后可以看到SSH的仓库地址&#xff1a;gitgitee.com:username/test.git**或gitgithub.com:Toukensan/test.git 配置SSH公钥 在本地通过命令行创建…

js学习--制作猜数字

猜数字制作 <!DOCTYPE html> <html><head><meta charset"utf-8"><title></title></head><body><script>function fun() {alert("1-100猜数字");let num Math.floor(Math.random() * 100) 1;for …

MDB-RS232 控制自动售货机MDB年龄验证设备

(以下是与台湾ICT的DCM5年龄验证设备测试数据) &#xff08;如果需要使用年龄验证设备&#xff0c;一定要记得购买MDB-RS232的PRO版本&#xff0c;也就是专业版&#xff09; 指令 HEX 代码 描述 RESET(复位) 68H 复位设备 SETUP(配置) 69H 读取年龄验证设备配置 Expa…

12个视觉艺术分类

视觉设计可以按照多种方式进行分类&#xff0c;这些分类通常基于设计的目的、风格或应用场景。本文为大家介绍12种视觉设计&#xff0c;分别是平面设计、标志设计、包装设计、用户界面设计 (UI Design)、用户体验设计 (UX Design)、插图设计、网页设计、动画设计、展览设计、环…

Python小练习05

一 绘制如下图形。 #Q1 import turtle as t def draw(n):for i in range(n):t.left(30)t.fd(100)t.left(120)t.fd(100)t.left(120)t.fd(100)t.left(120)t.fd(100)t.right(90) t.penup() t.goto(-150,20) t.speed(0) t.pendown() t.pencolor("red") t.pensize(5) draw…

CentOS搭建KMS服务器

CentOS搭建KMS服务器 一、使用git拉取vlmcsd项目并在本地编译 若还未安装git&#xff0c;使用命令yum install git -y进行安装。使用git gitgithub.com:Wind4/vlmcsd.git拉取项目。 cd vlmcsd #进入项目目录 make #进行编译二、开放防火墙端口&#xff0c;创建开机自启…

flask项目部署总结

这个部署的时候要用虚拟环境&#xff0c;cd进项目文件夹 python3 -m venv myenv source myenv/bin/activate激活 之后就安装一些库包之类的&#xff0c;&#xff08;flask&#xff0c;requests,bs4,等等&#xff09; 最重要的是要写.flaskenv文件并且pip install 一个能运行…

tls各个版本的安全性介绍

TLS&#xff08;Transport Layer Security&#xff09;协议的各个版本在安全性方面经历了逐步的演进和改进&#xff0c;以应对不断变化的网络安全威胁。以下是各主要版本的安全性概览&#xff1a; TLS 1.0&#xff1a; 发布于1999年&#xff0c;是SSL 3.0的后续版本。在其发布时…

单调栈(左小大,右小大)

①寻找每个数左边第一个比它小的数 给定一个长度为 N 的整数数列&#xff0c;输出每个数左边第一个比它小的数&#xff0c;如果不存在则输出 −1。 输入样例&#xff1a; 3 4 2 7 5 输出样例&#xff1a; -1 3 -1 2 2 从左到右遍历&#xff0c;用单调递增&#xff08;栈底到栈顶…

数据看板/可视化大屏的实际价值到底是什么?详解数据可视化的实用之处

数据驾驶舱/数据看板/可视化大屏的实际价值&#xff0c;取决于使用者的实际需求。 华而不实&#xff1f;华就是实&#xff01; 关于可视化大屏最广泛的争议&#xff0c;便是对其“华而不实”的批评&#xff0c;认为可视化大屏缺乏技术含量&#xff0c;只是一钟比较高级的“装饰…

推荐 2个功能强大的黑科技工具,真的会让你直呼卧槽

Waifu2X Waifu2x 是一个基于深度学习的开源项目&#xff0c;主要用于处理二次元动漫风格的图像。它使用卷积神经网络&#xff08;CNN&#xff09;进行超分辨率处理和降噪&#xff0c;能够将图像放大2倍或更多&#xff0c;同时显著提高清晰度和减少噪声。Waifu2x 特别针对日系漫…

小龙虾优化24种机器学习多输入单输出回归|时序预测模型

小龙虾优化24种机器学习多输入单输出回归|时序预测模型 文章目录 小龙虾优化24种机器学习多输入单输出回归|时序预测模型前言一、小龙虾优化基本原理二、优化机器学习模型1.COA-CNN-BiGRU-Attention回归模型2.基于小龙虾优化支持向量机的数据回归预测Matlab程序COA-SVM 多特征输…

还在Excel中管理您的持续改进项目吗?

对于大多数公司来说&#xff0c;Microsoft Excel是一种可靠的资源&#xff0c;它确实提供了极高的价值。然而&#xff0c;当它被用来跟踪持续改进项目时&#xff0c;它的价值就减少了。浪费时间从不同内部系统的不同报告中收集数据&#xff0c;会占用推动重要变革的时间。让我们…

使用微信开发者工具连接gitee

编写代码 打开微信开发者工具 编写小程序代码 提交代码 在微信开发者工具提交代码到gitee仓库的步骤&#xff1a; 1.在gitee创建仓库&#xff0c;得到仓库url 2.微信开发者工具设置远程仓库 点击版本管理-->点击设置-->网络和认证-->认证方式选择 使用用户名和…

STM32工业自动化控制系统教程

目录 引言环境准备工业自动化控制系统基础代码实现&#xff1a;实现工业自动化控制系统 4.1 数据采集模块 4.2 数据处理与分析 4.3 控制系统实现 4.4 用户界面与数据可视化应用场景&#xff1a;工业自动化与优化问题解决方案与优化收尾与总结 1. 引言 工业自动化控制系统利用…