P4513 小白逛公园 习题笔记(线段树维护区间最大连续子段和)

news2024/11/25 22:51:42

传送门icon-default.png?t=N7T8https://www.luogu.com.cn/problem/P4513本文参考了董晓老师的博客

这道题着实想了很长时间(新手),只能想到一个O(mn)的dp普通写法,那么遇上区间修改问题改怎么操作呢。答案很明显,线段树!

这道题的线段树主要维护四个信息

区间和,最大左子段和,最大右子段和,与区间最大连续子段和(是不是感觉很眼熟呢),在我的印象中,吉司机线段树(用min直接维护区间)与这题思路相类似。

这里的query还用了一种新的方式来维护

下面直接贴代码(见注释)

// Problem: 
//     P4513 小白逛公园
//   
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/P4513
// Memory Limit: 128 MB
// Time Limit: 1000 ms
// 
// Powered by CP Editor (https://cpeditor.org)

#include<iostream>
using namespace std;
const int N=5e5+10;
#define lc u<<1
#define rc u<<1|1
int a[N];
struct Tree{
	int l,r,sum,lmax,rmax,maxn;//区间和 左区间最大和 右区间最大 最大和
}tr[N*4];

void pushup(Tree &t,Tree a,Tree b){//这里和下面的query是最关键的两个地方
	t.sum=a.sum+b.sum;//求和
	t.lmax=max(a.lmax,b.lmax+a.sum);//左侧最大来自于左区间左侧和左区间+右区间左侧最大的
	t.rmax=max(b.rmax,a.rmax+b.sum);//与上面思路相同
	t.maxn=max(max(a.maxn,b.maxn),a.rmax+b.lmax);//来自于下面两边最大的,和中间的(前提连续)
}

Tree query(int u,int l,int r){
	if(l<=tr[u].l&&tr[u].r<=r){
		return tr[u];//直接返回这个类型
	}
	int m=(tr[u].l+tr[u].r)>>1;
	if(r<=m) return query(lc,l,r);
	if(l>m) return query(rc,l,r);
//这种操作与平常相反,原因是我们的线段树只能维护一定的线段,如果遇到断点就要另外处理,于是这里的两行意思是,全部在某一边,没有断点,这样一来就可以直接返回
	Tree t;
	pushup(t,query(lc,l,m),query(rc,m+1,r));
//这里是有断点的,就以pushup的方式合并一个(本来没有,所以直接开一个新的t)
	return t;
}
//需要注意 上面判断是l-r,因为直接包含了,接着找区间就好,下面的是断点,所以直接分开处理

void update(int u,int x,int k){
	if(tr[u].l==x&&tr[u].r==x){
		tr[u]={x,x,k,k,k,k};
		return;
	}
    int m=(tr[u].l+tr[u].r)>>1;
    if(x<=m) update(lc,x,k);
    if(x>m) update(rc,x,k);
    pushup(tr[u],tr[lc],tr[rc]);
}

void build(int u,int l,int r){
	tr[u]={l,r};//这里不能忘了,因为这里我荣幸WA一发
	if(l==r){
		tr[u]={l,r,a[l],a[l],a[l],a[l]};
		return;
	}
	int m=(l+r)>>1;
	build(lc,l,m);
	build(rc,m+1,r);
	pushup(tr[u],tr[lc],tr[rc]);
}

int main(){
	int n,m;cin>>n>>m;
	for(int i=1;i<=n;++i) cin>>a[i];
	build(1,1,n);
	while(m--){
		int op,b,c;cin>>op>>b>>c;
		if(op==1){
			if(b>c) swap(b,c);//交换,swap是c++的自带
			cout<<query(1,b,c).maxn<<endl;
		}
		else{
			update(1,b,c);//第b个变成了c
		}
	}
	return 0;
}

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

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

相关文章

微服务day01 -- SpringCloud01 -- (Eureka , Ribbon , Nacos)

介绍微服务 1.认识微服务(p1-p5) 随着互联网行业的发展&#xff0c;对服务的要求也越来越高&#xff0c;服务架构也从单体架构逐渐演变为现在流行的微服务架构。这些架构之间有怎样的差别呢&#xff1f; 1.0.学习目标 了解微服务架构的优缺点 1.1.单体架构 单体架构&#…

基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的稻田虫害检测系统详解(深度学习+Python代码+UI界面+训练数据集)

摘要&#xff1a;本篇文章深入探讨了如何利用深度学习技术开发一个用于检测稻田虫害的系统&#xff0c;并且分享了完整的实现过程和资源代码下载。该系统采用了当前的YOLOv8、YOLOv7、YOLOv6、YOLOv5算法&#xff0c;对其进行了性能对比&#xff0c;包括mAP、F1 Score等关键指标…

redis中通用命令以及key过期策略

通用命令 exists 判断某个key是否存在。 exists key时间复杂度&#xff1a;O(1) 返回值&#xff1a;key 存在的个数。 del 删除指定的 key&#xff0c;可以一次删除一个或者多个。 del key时间复杂度&#xff1a;O(1) 返回值&#xff1a;删除掉的 key 的个数。 expire…

根据索引策略对elasticsearch中的索引进行管理(附带图文教程)

前言 这是我在这个网站整理的笔记,有错误的地方请指出&#xff0c;关注我&#xff0c;接下来还会持续更新。 作者&#xff1a;神的孩子都在歌唱 一. 索引生命周期简介 想要了解更多可以看 &#xff1a; 索引生命周期 1.1 索引生命周期五种阶段 &#xff08;1&#xff09;Hot…

C++开发基础——类模板

一&#xff0c;基础定义 类模板是用来生成类的蓝图&#xff0c;是一种创建类的方式&#xff0c;同一套类模板可以生成很多种不同的类。 编译器基于类模板生成的每个类被称为类模板的实例。 第一次使用模板类型声明变量时&#xff0c;会创建类模板的一个实例&#xff0c; 以后…

YOLOv5改进 | 注意力篇 | 利用YOLO-Face提出的SEAM注意力机制优化物体遮挡检测(附代码 + 修改教程)

一、本文介绍 本文给大家带来的改进机制是由YOLO-Face提出能够改善物体遮挡检测的注意力机制SEAM&#xff0c;SEAM&#xff08;Spatially Enhanced Attention Module&#xff09;注意力网络模块旨在补偿被遮挡面部的响应损失&#xff0c;通过增强未遮挡面部的响应来实现这一目…

el-Switch 开关二次确认

前言 最近在做毕设&#xff0c;有个需求是点击按钮控制用户的状态是否禁用&#xff0c;就看到element有个switch组件可以改造一下&#xff0c;就上网看了一下&#xff0c;结果为了这个效果忙活了很久。。。所以说记录一下&#xff0c;让大家少踩坑。 前置条件 先看完我的需求再…

Eclipse安装springboot

Eclipse免费&#xff0c;套件丰富&#xff0c;代码开源&#xff0c;功能强大…推荐&#xff01; 1 下载eclipse: https://www.eclipse.org/downloads/download.php?file/technology/epp/downloads/release/2023-12/R/eclipse-jee-2023-12-R-win32-x86_64.zip 2 安装Spring框…

图论(蓝桥杯 C++ 题目 代码 注解)

目录 迪杰斯特拉模板&#xff08;用来求一个点出发到其它点的最短距离&#xff09;&#xff1a; 克鲁斯卡尔模板&#xff08;用来求最小生成树&#xff09;&#xff1a; 题目一&#xff08;蓝桥王国&#xff09;&#xff1a; 题目二&#xff08;随机数据下的最短路径&#…

Hadoop学习2:完全分布集群搭建

文章目录 Fully-Distributed Operation&#xff08;完全分布模式&#xff09; 重点机器环境同步集群规划配置文件修改以及同步步骤0&#xff1a;下面其他步骤涉及修改配置以这里为准&#xff08;要不然部署使用过程会有很多问题&#xff09;通用配置&#xff08;三台节点机器&a…

社交革命的引领者:探索Facebook如何改变我们的生活方式

1.数字社交的兴起 随着互联网的普及&#xff0c;社交媒体成为我们日常生活的重要组成部分。Facebook作为其中的先驱&#xff0c;从最初的社交网络演变成了一个拥有数十亿用户的全球化平台。它不仅改变了我们与世界互动的方式&#xff0c;还深刻影响了我们的社交习惯、人际关系以…

华为机考:HJ102 字符统计

华为机考&#xff1a;HJ102 字符统计 描述 方法1 先将所有字符计算数量&#xff0c;在对比其中字符的assic码 #include<iostream> #include<vector> #include<algorithm> #include<string> using namespace std; bool cmp(pair<char, int> a,…

C++ std::list的merge()使用与分析

看到《C标准库第2版》对list::merge()的相关介绍&#xff0c;令我有点迷糊&#xff0c;特意敲代码验了一下不同情况的调用结果。 《C标准库第2版》对list::merge()的相关介绍 list::merge()定义 merge()的作用就是将两个list合并在一起&#xff0c;函数有2个版本&#xff1a;…

数字图像处理-空间滤波

空间滤波 空域滤波基础 – 离散卷积的边缘效应 平滑空间滤波器 # -*- coding: utf-8 -*- # Author: Huazhong Yang # Email: cjdxyhz163.com # Time : 2024/3/7 20:26import cv2 import numpy as np# 读取图像 image cv2.imread(a1.png)# 应用高斯滤波 # 第二个参数是高斯…

微信小程序开发系列(三十)·小程序本地存储API·同步和异步的区别

目录 1. 同步API 1.1 getStorageSync存储API 1.2 removeStorageSync获取数据API 1.3 removeStorageSync删除 1.4 clearStorageSync清空 2. 异步API 2.1 setStorage存储API 2.2 getStorage获取数据API 2.3 removeStorage删除API 2.4 clearStorage清空 3. …

qt vs 编程 字符编码 程序从源码到编译到显示过程中存在的字符编码

理解字符编码&#xff0c;请参考&#xff1a;unicode ucs2 utf16 utf8 ansi GBK GB2312 CSDN博客 汉字&#xff08;或者说多字节字符&#xff09;的存放需求&#xff0c;是计算机中各种编码问题的最直接原因。如果程序不直接使用汉字&#xff0c;或间接在所有操作步骤中统一使…

Hilt

1.使用Hilt实现快速依赖注入 1.1 导入依赖 //hilt依赖//Hiltimplementation("com.google.dagger:hilt-android:2.44")annotationProcessor("com.google.dagger:hilt-android-compiler:2.44")1.2 在build.gradle(app)中加入插件 plugins {id("com.an…

大规模自动化重构框架--OpenRewrite浅析

目录 1. OpenRewrite是什么&#xff1f;定位&#xff1f; 2. OpenWrite具体如何做&#xff1f; 3. 核心概念释义 3.1 Lossless Semantic Trees (LST) 无损语义树 3.2 访问器&#xff08;Visitors&#xff09; 3.3 配方&#xff08;Recipes&#xff09; 4. 参考链接 Open…

SpringBlade error/list SQL 注入漏洞复现

0x01 产品简介 SpringBlade 是一个由商业级项目升级优化而来的 SpringCloud 分布式微服务架构、SpringBoot 单体式微服务架构并存的综合型项目。 0x02 漏洞概述 SpringBlade 框架后台 /api/blade-log/error/list路径存在SQL注入漏洞,攻击者除了可以利用 SQL 注入漏洞获取数…

Redis应用缓存

目录 前言 关于“二八定律” 使用Redis作为缓存 为什么关系型数据库性能不高 为什么并发量高了就容易宕机 Redis就是一个用来作为数据库缓存的常见方案 缓存更新策略 定期生成 搜索引擎为例 实时生成 淘汰策略 FIFO(First In First Out) 先进先出 lRU(Least …