GSS3 - Can you answer these queries III

news2024/11/25 0:38:19

GSS3 - Can you answer these queries III

题面翻译

n n n 个数, q q q 次操作

操作0 x y A x A_x Ax 修改为 y y y

操作1 l r询问区间 [ l , r ] [l, r] [l,r] 的最大子段和

感谢 @Edgration 提供的翻译

题目描述

You are given a sequence A of N (N <= 50000) integers between -10000 and 10000. On this sequence you have to apply M (M <= 50000) operations:
modify the i-th element in the sequence or for given x y print max{Ai + Ai+1 + … + Aj | x<=i<=j<=y }.

输入格式

The first line of input contains an integer N. The following line contains N integers, representing the sequence A1…AN.
The third line contains an integer M. The next M lines contain the operations in following form:
0 x y: modify Ax into y (|y|<=10000).
1 x y: print max{Ai + Ai+1 + … + Aj | x<=i<=j<=y }.

输出格式

For each query, print an integer as the problem required.

样例 #1

样例输入 #1

4
1 2 3 4
4
1 1 3
0 3 -3
1 2 4
1 3 3

样例输出 #1

6
4
-3

分析

线段树,但维护什么呢?可以维护一个最大子段和,那么见下图:
图图
线段树把区间分成两段,这里叫L,R吧,可以得出最大子段和: m a x n = max ⁡ L m a x n , R m a x n maxn=\max{L_{maxn}},{R_{maxn}} maxn=maxLmaxn,Rmaxn
但这两种情况仍不足,可能最大子段和来自L和R,如图
在这里插入图片描述

故应维护最大前缀和pre,与最大后缀和suf,得出公式 m a x n = max ⁡ { L m a x n , R m a x n , L s u f + R p r e } maxn=\max\{{L_{maxn}},{R_{maxn}},L_{suf}+R_{pre}\} maxn=max{Lmaxn,Rmaxn,Lsuf+Rpre}
那么怎么维护pre与suf呢,不难想到:
p r e = max ⁡ L p r e , L s u m + R p r e pre=\max L_{pre},L_{sum}+R_{pre} pre=maxLpre,Lsum+Rpre
s u f = max ⁡ R s u f , L s u f + R s u m suf=\max R_{suf},L_{suf}+R_{sum} suf=maxRsuf,Lsuf+Rsum
需要维护区间和sum

代码

#include <bits/stdc++.h>
using namespace std;
const int M = 1e5+10;
int a[M],n,m;
void read(){
	cin>>n;
	for (int i=1;i<=n;i++) cin>>a[i];	
	cin>>m;
}
struct node{
	int maxn,pre,suf,sum;
};
struct segment{
	#define rc(x) ((x<<1)|1)
	#define lc(x) (x<<1)
	node seg[M<<2];
	void push_up(int x){
		int l=lc(x),r=rc(x);
		seg[x].sum=seg[l].sum+seg[r].sum;
		seg[x].pre=max(seg[l].pre,seg[l].sum+seg[r].pre);
		seg[x].suf=max(seg[r].suf,seg[r].sum+seg[l].suf);
		seg[x].maxn=max(max(seg[l].maxn,seg[r].maxn),seg[l].suf+seg[r].pre);
	}
	void build(int o,int l,int r){
		if (l==r) {
			seg[o].maxn=seg[o].pre=seg[o].suf=seg[o].sum=a[l];
			return;
		}
		int mid=l+r>>1;
		build(lc(o),l,mid);
		build(rc(o),mid+1,r);
		push_up(o);
	}
	void update(int x,int y,int o=1,int l=1,int r=n){
		if (l==r and l==x) {
			seg[o].maxn=seg[o].pre=seg[o].suf=seg[o].sum=y;
			return;
		}
		if (x<l or r<x) return;
		int mid=l+r>>1;
		update(x,y,lc(o),l,mid);
		update(x,y,rc(o),mid+1,r);
		push_up(o);
	}
	node query(int ql,int qr,int o=1,int l=1,int r=n){
		if (ql<=l and r<=qr) return seg[o];
		int mid=l+r>>1;bool f1=0,f2=0;
		node left,right;
		if (ql<=mid) left=query(ql,qr,lc(o),l,mid),f1=1;
		if (mid+1<=qr) right=query(ql,qr,rc(o),mid+1,r),f2=1;
		node ans;
		if (f1 and f2){
			ans.sum=left.sum+right.sum;
			ans.pre=max(left.pre,left.sum+right.pre);
			ans.suf=max(right.suf,right.sum+left.suf);
			ans.maxn=max(max(left.maxn,right.maxn),left.suf+right.pre);
		}
		else if(f1) ans=left;
		else ans=right;
		return ans;
	}
}T1;
void solve(){
	int x,y,z;
	cin>>z>>x>>y;
	if(z) cout<<T1.query(x,y).maxn<<endl;
	else T1.update(x,y);
}
int main(){
	read();
	T1.build(1,1,n);
	while(m--) solve();
	return 0;
}

分析

	node query(int ql,int qr,int o=1,int l=1,int r=n){
		if (ql<=l and r<=qr) return seg[o];
		int mid=l+r>>1;bool f1=0,f2=0;
		node left,right;
		if (ql<=mid) left=query(ql,qr,lc(o),l,mid),f1=1;
		if (mid+1<=qr) right=query(ql,qr,rc(o),mid+1,r),f2=1;
		node ans;
		if (f1 and f2){
			ans.sum=left.sum+right.sum;
			ans.pre=max(left.pre,left.sum+right.pre);
			ans.suf=max(right.suf,right.sum+left.suf);
			ans.maxn=max(max(left.maxn,right.maxn),left.suf+right.pre);
		}
		else if(f1) ans=left;
		else ans=right;
		return ans;
	}

这段不好理解故分了3部分

  1. 查询区间来自两部分:需合并两部分,可以看看push_up
  2. 来自左部分:返回left
  3. 来自右部分:返回right

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

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

相关文章

Python(七十三)集合间的关系

❤️ 专栏简介&#xff1a;本专栏记录了我个人从零开始学习Python编程的过程。在这个专栏中&#xff0c;我将分享我在学习Python的过程中的学习笔记、学习路线以及各个知识点。 ☀️ 专栏适用人群 &#xff1a;本专栏适用于希望学习Python编程的初学者和有一定编程基础的人。无…

FANUC机器人SRVO-105和SRVO-067故障报警原因分析及处理方法

FANUC机器人SRVO-105和SRVO-067故障报警原因分析及处理方法 如下图所示,公司的一台机器人在正常工作时突然报警SRVO-105门打开或紧急停止,同时还有SRVO-067 OHAL2报警(G:1 A:2),按Reset键无法消除报警, 那么遇到这种情况,首先,我们来看一下报警说明书上的解释: 首先…

linuxARM裸机学习笔记(7)----RTC实时时钟实验

基础概念&#xff1a; I.MX6U 内部也有个RTC 模块&#xff0c;但是不叫作“ RTC ”&#xff0c;而是叫做“ SNVS ”。 SNVS 直译过来就是安全的非易性存储&#xff0c; SNVS 里面主要是一些低功耗的外设&#xff0c;包括一个 安全的实时计数器 (RTC) 、一个单调计数器 (mo…

SpringBoot集成百度人脸识别实现登陆注册功能Demo(二)

前言 上一篇SpringBoot集成百度人脸demo中我使用的是调用本机摄像头完成人脸注册&#xff0c;本次demo根据业务需求的不同我采用文件上传的方式实现人脸注册。 效果演示 注册 后端响应数据&#xff1a; 登录 后端响应数据&#xff1a; 项目结构 后端代码实现 1、BaiduAiUtil…

整理mongodb文档:删

个人博客 整理mongodb文档:删 求关注&#xff0c;哪儿不足&#xff0c;求大佬们指出&#xff0c;哪儿写的不够通俗易懂跟清晰&#xff0c;也求指出 文章概叙 本文主要是介绍了删除数据的几个方法&#xff0c;主要还是在介绍deleteMany、deleteOne以及remove&#xff0c;对于…

IL汇编 ldarg 指令学习

IL汇编代码&#xff0c; .assembly extern mscorlib {} .assembly MathLib {.ver 1 : 0 : 1 : 0 }.module MathLib.dll.namespace MyMath { .class public ansi auto MathClass extends [mscorlib]System.Object{ .method public int32 GetSquare(int32) c…

Linux c++反汇编源码细节解释说明

示例c源码: int main(int argc, char** argv) {auto sk argc;int a 11 << sk;int b 19 argc;volatile int rv a b * 8;rv * sk;return rv; } GUN x86 64bit AT&T 汇编环境下用 g -O1 -Wa,-adhln ./main.cc命令反汇编 反汇编源码: 0000 89F9 movl %ed…

ESP32-CAM ——Blinker平台

ESP32-CAM&#xff0c;点灯云平台Blinker&#xff0c;MQTT协议&#xff0c;APP控制&#xff0c;Wifi视频监控&#xff0c;点灯&#xff0c;控制舵机。 一 环境搭建 两个宝藏网站 点灯科技 (diandeng.tech) 软件下载 - Arduino中文社区 第一次体验Arduino 按照上面教程安装ES…

C++笔记之两个类的实例之间传递参数的各种方法

C笔记之两个类的实例之间传递参数的各种方法 code review! 文章目录 C笔记之两个类的实例之间传递参数的各种方法1.构造函数参数传递2.成员函数参数传递3.友元函数4.友元类5.传递指针或引用6.静态成员变量7.静态成员函数8.全局变量或命名空间9.回调函数和函数指针10.观察者模…

【第五章 flutter学习之flutter进阶组件-上篇】

文章目录 一、列表组件1.常规列表2.动态列表 二、FridView组件三、Stack层叠组件四、AspectRatio Card CircleAvatar组件五、按钮组件六、Stack组件七、Wrap组件八、StatefulWidget有状态组件总结 一、列表组件 1.常规列表 children: const <Widget>[ListTile(leading: …

喀麦隆ECTN(BESC)申请流程

据CAMEROON喀麦隆法令&#xff0c;所有发货至喀麦隆的货物都必须申请ECTN(BESC)电子货物跟踪单。如果没有申请&#xff0c;将被视为触犯喀麦隆的条例&#xff0c;并在目的港受到严厉惩罚。ECTN是英语ELECTRONIC CARGO TRACKING NOTE的简称&#xff1b;BESC是法语BORDEREAU ELEC…

开关电源控制--bode图相角裕量的选择

什么是相角裕量 在Bode图中&#xff0c;相角裕量是指系统的相位裕量&#xff0c;用于评估系统的稳定性和频率响应特性。 Bode图是一种常用的频率响应图&#xff0c;将系统的增益和相位随频率变化的情况绘制出来。在Bode图中&#xff0c;相角裕量表示系统的相位与-180度&#…

ensp与虚拟机搭建测试环境

1.虚拟机配置 ①首先确定VMnet8 IP地址&#xff0c;若要修改IP地址&#xff0c;保证在启动Ensp前操作 ②尽量保证NAT模式 2.ensp配置 (1)拓扑结构 (2)Cloud配置 ①首先点击 绑定信息 UDP → 增加 ②然后点击 绑定信息 VMware ... → 增加 ③最后在 端口映射设置上点击双向通…

编译工具:CMake(二)| 最简单的实例[构建、解析、外部构建]

编译工具&#xff1a;CMake&#xff08;二&#xff09;| 最简单的实例[构建、解析、外部构建] 编写代码与文件构建工程解析PROJECT 指令的语法是&#xff1a;SET 指令的语法是&#xff1a;MESSAGE 指令的语法是&#xff1a;ADD_EXECUTABLE 指令${} 指令 外部构建 # 前言 按照程…

github 无语的问题,Host does not existfatal: Could not read from remote repository.

Unable to open connection: Host does not existfatal: Could not read from remote repository. image.png image.png image.png Please make sure you have the correct access rights and the repository exists. 如果github desktop和git pull 和git clone全部都出问题了&…

ebay儿童书包产品CPC认证

儿童书包是一种能够盛放书本或者文具的包。现在的书包五花八门&#xff0c;以普通的布料或者是帆布等制成&#xff0c;有背带&#xff0c;包内一般分栏。一般分三种&#xff0c;背在身后的&#xff0c;挎在肩上的&#xff0c;轮式&#xff08;可以拖行&#xff09;的。 一、美国…

探索未来:直播实时美颜SDK在增强现实(AR)直播中的前景

在AR直播中&#xff0c;观众可以与虚拟元素实时互动&#xff0c;为用户带来更加丰富、沉浸式的体验。那么&#xff0c;直播美颜SDK在AR中有哪些应用呢&#xff1f;下文小编将于大家一同探讨美颜SDK与AR有哪些关联。 一、AR直播与直播实时美颜SDK的结合 增强现实技术在直播中…

使用C#的窗体显示与隐藏动画效果方案 - 开源研究系列文章

今天继续研究C#的WinForm的显示动画效果。 上次我们实现了无边框窗体的显示动画效果(见博文&#xff1a;基于C#的无边框窗体动画效果的完美解决方案 - 开源研究系列文章 )&#xff0c;这次介绍的是未在任务栏托盘中窗体的显示隐藏动画效果的实现代码。 1、 项目目录&#xff1b…

(03)Unity HTC VRTK 基于 URP 开发记录

1.简介 本篇主要内容为&#xff1a;URP如何与VRTK结合、URP需要注意的地方、VRTK的功能进行阐述。 因项目本身要求要渲染出比较好的画质&#xff0c;所以抛弃了Unity默认渲染管线Built-in&#xff0c;使用URP进行渲染&#xff0c;当然也可以选HDRP&#xff0c;但考虑到后期项目…

STM32 4G学习(二)

特性参数 ATK-IDM750C是正点原子开发的一款高性能4G Cat1 DTU产品&#xff0c;支持移动4G、联通4G和电信4G手机卡。 它以高速率、低延迟和无线数传作为核心功能&#xff0c;可快速解决应用场景下的无线数传方案。 它支持TCP/UDP/HTTP/MQTT/DNS/RNDIS/NTP协议&#xff0c;支持…