线段树小例题——结合前后缀获得结果

news2024/11/23 0:46:47

和我今天上午写的那个前后缀太像了,不能说一模一样,但是至少我觉得思路是真的一点没变

上一道题的链接:http://t.csdnimg.cn/pXBnU

P4513 小白逛公园 

题意:有n个点,每个点都有一个初值,然后有m个操作,分为两种 ,一种是修改操作,可以修改单点的值,还有一种操作会告诉你范围,让你找出范围内最大的连续公园

思路:如果你有幸看过上面那个题解,恭喜你,这一边又可以巩固一遍了 

这题我们还是类似于前后缀,但是变成了前缀和和后缀和,那么我们线段树的变量该怎么去设置呢?
maxn表示的是区间的最大值,maxl表示从左端点开始区间的最大值,maxr表示从右端点开始区间的最大值,sum表示整个区间的和

我们在选取区间最大值的时候

处理左右孩子的连接处:首先需要去判断左孩子的maxr和右孩子的maxl的值是否都是小于0的,如果都小于0,那么久从中取出最小的作为当前结点的最大值,如果都是正数,那么哪部分是正的哪部分就加进去

然后就是正常处理

当前结点的最大值和左右孩子的最大值相比,选出最大的作为当前结点的最大值

当前结点以左端点开始开始的最大值=左孩子的左端点为起始点的最大值和左孩子的和+右孩子以左端点为起始的最大值 

当前结点的右端点同理

在查询的时候

1、如果查询区间覆盖这一节点,将该节点信息返回。

2、如果只与一个儿子有交集,就返回在那个儿子中查找到的信息。

3、如果与两个儿子都有交集,就先分别计算出两个儿子的信息,然后按修改的方式将两个信息合并,然后返回。

4、最后返回的max值即为答案。

因此就可以写出代码了

#include<bits/stdc++.h>
using namespace std;
#define int long long
int n,m;
int num[500005];
struct node{
	int l,r;
	int maxn;
	int maxl;
	int maxr;
	int sum;
}tree[500005*4];
int flag;
int a,b;

void pushdown(node &t, const node &lt, const node &rt)
{
    if (lt.maxr < 0 && rt.maxl < 0)
    {
        t.maxn = max(lt.maxr, rt.maxl);
    }
    else
    {
        t.maxn = 0;
        if (lt.maxr > 0)
        {
            t.maxn += lt.maxr;
        }
        if (rt.maxl > 0)
        {
            t.maxn += rt.maxl;
        }
    }
    t.maxn = max(t.maxn, max(lt.maxn, rt.maxn));
    t.maxl = max(lt.maxl, lt.sum + rt.maxl);
    t.maxr = max(rt.maxr, rt.sum + lt.maxr);
    t.sum = lt.sum + rt.sum;
}
void build(int i,int l,int r)
{
	tree[i].l=l;
	tree[i].r=r;
	if(l==r)
	{
		tree[i].maxn=tree[i].maxl=tree[i].maxr=tree[i].sum=num[l];
		return ;
	}
	int mid=(l+r)/2;
	build(i*2,l,mid);
	build(i*2+1,mid+1,r);
	pushdown(tree[i], tree[i * 2], tree[i * 2 + 1]);
}

void change(int i,int dis,int k)
{
	if(tree[i].l==tree[i].r)
	{
		tree[i].sum=tree[i].maxn=tree[i].maxl=tree[i].maxr=k;
		return ;
	}
	int mid=(tree[i].l+tree[i].r)/2;
	if(dis<=mid)
	{
		change(i*2,dis,k);
	}
	else
	{
		change(i*2+1,dis,k);
	}
	pushdown(tree[i],tree[i * 2],tree[i * 2 + 1]);
}

node find(int i,int l,int r)
{
	if(tree[i].l>=l&&tree[i].r<=r)
	{
		return tree[i];
	}
	int mid=(tree[i].l+tree[i].r)/2;
	if(l<=mid&&mid+1<=r)
	{
		node rt;
		pushdown(rt,find(i*2,l,r),find(i*2+1,l,r));
		return rt;
	}
	else if(l<=mid)
	{
		return find(i*2,l,r);
	}
	else
	{
		return find(i*2+1,l,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>>flag>>a>>b;
		if(flag==1)
		{
			if(a>b)
			swap(a,b);
			cout<<find(1,a,b).maxn<<"\n";
		}
		else
		{
			change(1,a,b);
		}
	}
	return 0;
}

 

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

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

相关文章

SQL慢查询优化方式

目录 一、SQL语句优化 1. 避免使用 SELECT * &#xff0c;而是具体字段 2.避免使用 % 开头的 LIKE 的查询 3.避免使用子查询&#xff0c;使用JOIN 4.使用EXISTS代替IN 5.使用LIMIT 1优化查询 6.使用批量插入、优化INSERT操作 7.其他方式 二、SQL索引优化 1.在查询条件…

Java异常详解(全文干货)

介绍 Throwable Throwable 是 Java 语言中所有错误与异常的超类。 Throwable 包含两个子类&#xff1a;Error&#xff08;错误&#xff09;和 Exception&#xff08;异常&#xff09;&#xff0c;它们通常用于指示发生了异常情况。 Throwable 包含了其线程创建时线程执行堆栈…

分库分表学习笔记(二)

分库分表学习笔记&#xff08;一&#xff09;-CSDN博客 分表分库规则 图源&#xff08;https://zhuanlan.zhihu.com/p/535713197&#xff09; 水平分表 水平分表一般是我们数据库的数据太多了&#xff0c;原大众点评的订单单表早就已经突破两百G。 数据量太多的影响 1. 查询…

linux dma cache和主存数据不一致问题

1、问题原因 根本原因是cache和dma的目的地址存在重叠。 如果DMA的目的地址与Cache所缓存的内存地址访问有重叠&#xff08;如上图所示&#xff09; &#xff0c; 经过DMA操作&#xff0c; 与Cache缓存对应的内存中的数据已经被修改&#xff0c; 而CPU本身并不知道&#xff0c…

VScode开发ESP32

以下是所有的功能 先选择串口&#xff0c;再选择编译&#xff0c;然后再烧录

2023年最新自适应主题懒人网址导航v3.9php源码

源码简介 这个懒人网址导航源码是一个基于PHPMySQL开发的网址导航系统。该版本是在原有3.8版本的基础上进行了修复和功能增强。我们建议新用户直接使用这个最新版本&#xff0c;放弃旧版本。如果你有二次开发的能力&#xff0c;可以根据更新日志自行进行升级。我们将在后期继续…

论文阅读笔记:RepViT: Revisiting Mobile CNN From Vit Perspective

文章目录 RepViT: Revisiting Mobile CNN From Vit Perspective动机现状问题 贡献实现Block设置独立的token融合器和通道融合器减少膨胀并增加宽度 宏观设计stem的早期卷积简单分类器整体阶段比率 微观设计内核大小选择Squeeze-and-excitation层放置网络架构 实验ImageNet-1K上…

idea import配置

简介 本文记录idea中import相关配置&#xff1a;自动导入依赖、自动删除无用依赖、避免自动导入*包 自动导入依赖 在编辑代码时&#xff0c;当只有一个具有匹配名称的可导入声明时&#xff0c;会自动添加导入 File -> Settings -> Editor -> General -> Auto Imp…

基于xr-frame实现微信小程序的人脸识别3D模型叠加AR功能(含源码)

前言 xr-frame是一套小程序官方提供的XR/3D应用解决方案&#xff0c;基于混合方案实现&#xff0c;性能逼近原生、效果好、易用、强扩展、渐进式、遵循小程序开发标准。xr-frame在基础库v2.32.0开始基本稳定&#xff0c;发布为正式版&#xff0c;但仍有一些功能还在开发&#…

笔试——双指针算法

双指针&#xff1a; 把数组下标看作指针&#xff0c;注意数组越界问题&#xff0c;注意区间边界值 文章目录 283.移动零1089.复写零 283.移动零 class Solution {public void moveZeroes(int[] nums) {int cur 0;int dest -1;while(cur < nums.length)if(nums[cur] ! 0)…

uni-app开发日志:schema2code生成的新增页和修改页因字段太多用分段器实现分段分类

schema2code默认只能实现较为简单的分组&#xff0c;当填写项目较多的时候&#xff0c;肯定是用选项卡明确分段比较合适&#xff0c;这时候schema2code自生成的就没法实现了&#xff0c;摒着最最少的代码修改来尝试设置生成前的schema和生成后的vue页面。 一、schema设计 先把…

ORA-16072: a minimum of one standby database destination is required

原因 Doc ID 260819.1 The problem is that these Data Guard protection mode will not allow the database to be opened without a Standby Database available and a corresponding setup log_archive_dest_n. Therefore the Data Guard Protection Mode must be reduced…

MATLAB 地面点构建三角网(83)

MATLAB 地面点构建三角网(83) 一、算法介绍二、算法实现1.代码一、算法介绍 使用少量的抽稀后的地面点。构建了一层2.5维的三角网,用于表示地形的起伏变化,随着点数量增多,构建和耗时都会相应增加,这里只是输出和研究三角网构建效果,并不做实际工程使用,具体的构建结果…

在容器 (podman) 中运行虚拟机 (QEMU/KVM, libvirt)

虚拟机 (virtual machine) 是一种计算机的虚拟化技术, 容器 (container) 是一种更轻量级的虚拟化技术. 虚拟机可以套娃 (嵌套, nest), 也就是在虚拟机中运行虚拟机. 容器也可以套娃, 比如 Docker in Docker, Podman in Podman, Podman in Docker 等. 容器和虚拟机也可以互相套娃…

【云原生之kubernetes实战】k8s环境中部署Nginx服务

【云原生之kubernetes实战】k8s环境中部署Nginx服务 一、Nginx介绍1.1 Nginx简介1.2 Nginx特点1.3 Nginx使用场景二、本次实践介绍2.1 本次实践简介2.2 本次环境规划三、检查k8s环境3.1 检查工作节点状态3.2 检查系统pod状态四、部署storageclass(可选)4.1 配置NFS服务器4.2 …

Leetcode42接雨水(单调栈)

题目 题目链接 解法一 求出前缀最大和后缀最大&#xff0c;用两者较小值减去当前高度&#xff0c;累加即可&#xff0c;这个思路容易想到&#xff0c;这里不赘述 class Solution { public:int trap(vector<int>& height) {vector<int> preMx(height.size()…

故障检测(同相/反相放大器+电压跟随器)+概念(开环/闭环增益+增益的频率依赖性+3dB/单位增益带宽+增益-频率依赖性+相移)

2024-8-28&#xff0c;星期二&#xff0c;20:19&#xff0c;天气&#xff1a;阴雨&#xff0c;心情&#xff1a;晴。今天没什么事情发生&#xff0c;继续学习。 今天完成了第六章运算放大器的学习&#xff0c;开始了第七章运算放大器响应的学习&#xff0c;主要学习内容为&…

毕 业 设 计(论 文)远程接入企业网络规划与设计

毕 业 设 计&#xff08;论 文&#xff09; 远程接入企业网络规划与设计 毕业设计论文中文摘要 随着Internet技术的日益普及&#xff0c;网络技术的飞速发展&#xff0c;企业信息化工作越来越受到重视&#xff0c;进入二十一世纪后&#xff0c;企业信息化不再满足于个人或单…

使用WireShark的tshark命令,在window系统Cmd命令行抓包(附环境变量的设置)

WireShark在window系统Cmd命令行的抓包应用 工作中&#xff0c;有时候会遇到抓特定数据包的情况&#xff0c;但是却不知道这个特定数据包什么时候出现。因此就需要有设备值守抓包&#xff0c;这时就可以使用wireshark提供的tshark命令抓包。 一、抓包需求&#xff1a; 例如&am…

【虚拟化】KVM常用命令操作(virsh虚拟机常用操作之开关|连接|自启|克隆|快照)

目录 ​编辑一、KVM概述 1.1 KVM工具栈 1.2 libvirt架构概述 二、使用virsh管理虚拟机 三、kvm基本功能管理 1.帮助命令 2.KVM的配置文件存放目录 3.查看虚拟机状态 4.虚拟机关机与开机 5.强制虚拟机系统关闭电源 6.通过配置文件启动虚拟机系统 7.修改虚拟机配置文…