线段树求区间最值问题

引言

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

对应一个无法改变顺序的数组,我们想要去求一个区间内的最值,假设有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,一经查实,立即删除!

相关文章

股票分析-20240628

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

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…

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 …

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…

flask项目部署总结

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

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

①寻找每个数左边第一个比它小的数 给定一个长度为 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 多特征输…

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

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

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

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

MySQL 如何实现将数据实时同步到 ES ?

引言&#xff1a;在现代应用程序开发中&#xff0c;通常会将数据存储在 MySQL 中&#xff0c;用于事务性处理和数据持久化。而 Elasticsearch&#xff08;ES&#xff09;则是一种专门用于全文搜索和分析的强大工具。将这两者结合使用的一个常见需求是实时将 MySQL 中的数据同步…

Build a Large Language Model (From Scratch)附录C(gpt-4o翻译版)

来源&#xff1a;https://github.com/rasbt/LLMs-from-scratch?tabreadme-ov-file https://www.manning.com/books/build-a-large-language-model-from-scratch

开始尝试从0写一个项目--后端(一)

创建文件的目录结构 利用这个界面创建 序号 名称 说明 1 SEMS maven父工程&#xff0c;统一管理依赖版本&#xff0c;聚合其他子模块 2 sems-common 子模块&#xff0c;存放公共类&#xff0c;例如&#xff1a;工具类、常量类、异常类等 3 sems-pojo 子模块&#x…

找不到msvcp120.dll无法继续执行的原因分析及解决方法

在计算机使用中&#xff0c;经常会遇到msvcp120.dll文件丢失的情况&#xff0c;很多人对这个文件不是很熟悉&#xff0c;今天就来给大家讲解一下msvcp120.dll文件的丢失以及这个文件的重要性&#xff0c;让大家更好地了解计算机&#xff0c;同时也可以帮助我们更好地掌握这个文…

揭秘品牌成功秘诀:品牌营销策略的核心要素大公开

品牌营销作为企业战略中至关重要的一环&#xff0c;其核心是建立和传播品牌的独特魅力&#xff0c;使其在消费者心目中占据重要位置。 一个成功的品牌营销策略能够提升品牌的知名度和影响力&#xff0c;带来持续的销售和忠诚客户群体。 在当今竞争激烈的市场环境中&#xff0…

树状数组基础知识

lowbit: lowbit(x)x&(-x) 树状数组&#xff1a; 树状数组的功能&#xff1a; 数组 在O(1)的时间复杂度实现单点加&#xff1a; 在O(lng n)的时间复杂度实现查询前缀和&#xff1a; 树状数组的定义&#xff1a; 查询前x项的和操作&#xff1a; ll query(int x){ll s0;f…

户用分布式光伏项目开发模式

随着全球对可再生能源的重视和技术的不断进步&#xff0c;分布式光伏发电作为一种清洁、高效、可再生的能源形式&#xff0c;正逐渐成为新能源发展的重要方向。户用分布式光伏项目&#xff0c;作为分布式光伏发电的重要组成部分&#xff0c;其开发模式对于推动光伏产业的普及与…

二分查找及其变种

一、概念 二分查找算法&#xff08;Binary Search Algorithm&#xff09;是一种在有序数组中查找特定元素的高效搜索方法。 其基本思想是将目标值与数组中间的元素进行比较&#xff0c;如果目标值等于中间元素&#xff0c;则查找成功&#xff1b;如果目标值小于中间元素&…