当前位置: 首页 > news >正文

luogu P4513 小白逛公园

题目大意

需要一种数据结构,支持以下两种操作:

  1. 单点修改
  2. 区间求最大连续子段和

Sol

很容易想到线段树
首先我们要维护一个区间和\(sum\)
但是只用\(sum\)不能维护区间最大连续子段和
发现最大连续子段和可以从以下几种方式转移:

  1. 左子区间从右开始最大连续和+右子区间从左开始的最大连续和
  2. 左子区间最大连续子段和
  3. 右子区间最大连续子段和

所以我们需要额外维护:

  1. \(lmax\)表示当前区间从左开始最大连续和
  2. \(rmax\)表示当前区间从右开始最大连续和

考虑\(lmax\)如何转移:

  1. 从左子区间的\(lmax\)转移
  2. 左子区间和+右子区间的\(lmax\)

\(rmax\)同理

注意,在查询时,如果跨越两边,由于所给区间不会完全被某两个区间包裹,我们需要在递归返回过程中重新计算贡献
(也就是返回一个 Node

Code

#include <cstdio>
#include <iostream>
#include <algorithm>using namespace std;typedef long long LL;const int N = 5e5+10;
const LL INF = 0x3f3f3f3f3f3f3f3f;struct Node {int l , r;LL sum;LL lmax , rmax , dmax;
};int n , m;
int a[N];
Node tr[N*4];void pushup(int x) {tr[x].sum = tr[x<<1].sum + tr[x<<1|1].sum;tr[x].lmax = max(tr[x<<1].lmax , tr[x<<1].sum+tr[x<<1|1].lmax);tr[x].rmax = max(tr[x<<1|1].rmax , tr[x<<1|1].sum+tr[x<<1].rmax);tr[x].dmax = max(tr[x<<1].rmax+tr[x<<1|1].lmax , max(tr[x<<1].dmax , tr[x<<1|1].dmax));
}void build(int x , int l , int r) {tr[x] = {l , r , 0 , 0 , 0 , 0};if(l == r) {tr[x] = {l , r , a[l] , a[l] , a[l] , a[l]};return ;}int mid = (l+r) >> 1;build(x<<1 , l , mid);build(x<<1|1 , mid+1 , r);pushup(x);
}void modify(int x , int l , LL k) {if(tr[x].l == tr[x].r) {tr[x] = {tr[x].l , tr[x].r , k , k , k , k};return;}int mid = (tr[x].l + tr[x].r) >> 1;if(l <= mid) modify(x<<1 , l , k);else modify(x<<1|1 , l , k);pushup(x);
}Node query(int x , int l , int r) {if(l <= tr[x].l && tr[x].r <= r) return tr[x];int mid = (tr[x].l+tr[x].r) >> 1;if(l <= mid && mid < r) {Node t , ls = query(x<<1 , l , r) , rs = query(x<<1|1 , l , r);t.sum = ls.sum + rs.sum;t.lmax = max(ls.lmax , ls.sum + rs.lmax);t.rmax = max(rs.rmax , rs.sum + ls.rmax);t.dmax = max(max(ls.dmax , rs.dmax) , ls.rmax+rs.lmax);return t;}if(r <= mid) return query(x<<1 , l , r);if(l > mid) return query(x<<1|1 , l , r);return Node();
}int main() {ios::sync_with_stdio(false);cin.tie(nullptr); cout.tie(nullptr);cin >> n >> m;for(int i = 1 ; i <= n ; i ++)cin >> a[i];build(1 , 1 , n);while(m --) {int opt , x , y;cin >> opt >> x >> y;if(opt & 1) {if(x > y) swap(x , y);cout << query(1 , x , y).dmax << '\n';} else {modify(1 , x , y);}}return 0;
}

闲话

事实上,这个题被丢在我的题堆里两个月了

http://www.hskmm.com/?act=detail&tid=29604

相关文章:

  • 2025 年碟式离心机厂家 TOP 企业品牌推荐排行榜,DB640 系列 / DB330 系列 / DB440 系列 / DB460 系列 / DB550 系列 / 专业碟式离心机推荐这十家公司!
  • 20231408徐钰涵课程思维导图Openssl实践
  • 案例分析-DNS+tcpdump+wireshark
  • 2025 年卧式离心机厂家 TOP 企业品牌推荐排行榜,LW250/LW350/LW450/LW530/LW540 / 专业卧式离心机推荐这十家公司!
  • 2025 年水泥管厂家最新推荐排行榜,国标水泥管,二级水泥管,钢筋混凝土水泥管,大口径水泥管,平口水泥管公司推荐!
  • Day1 经典Holle word
  • 内存知识总结
  • 2025 年金属复合板厂家推荐广东粤洋建材科技有限公司,实力产能与定制服务全景解析金属复合板公司推荐
  • 2025 年铝蜂窝板厂家最新推荐排行榜,铝蜂窝板,铝蜂窝吊顶,铝蜂窝墙面板,微孔吸音板,防火A级铝复合板公司推荐
  • 读书笔记:关于Oracle里的“老古董”:LONG类型
  • 致技术社区的英雄们:一场关于文明未来的建造邀请
  • AI图片生成思路
  • SCP/NOIP 复习:插板法
  • 内存泄漏与SWAP
  • 今天开通自己的博客啦,加油加油!成为合格的牛马! - Irving11
  • 2025安全光栅厂家最新权威推荐榜:精准防护与高效性能的工业
  • 分块学习笔记
  • 2025年10月精加工车间恒温恒湿系统厂家推荐:精准控温与高效节能首
  • 977. 有序数组的平方 双指针
  • 完整教程:iSCSI服务器
  • 深入解析:数据库视图:虚拟表的强大应用
  • agc001_c题解
  • 【IMU】6轴数据校准算法
  • 2025 年 MES 服务商 TOP 平台机构推荐排行榜,mes 系统 /mes 软件 /mes 制造执行系统 /mes 生产制造执行系统 /mes 生产管理系统公司推荐
  • 2025 年10月 WMS 服务商最新推荐榜单,wms系统 wms软件,wms仓库管理软件,wms仓库管理系统软件公司推荐
  • 【仿生机器人】核心采购清单 (仿生机器人头方案)
  • CF数据结构题做题记录-1
  • 完整教程:安宝特产品丨FME Realize:重构数据与现实的边界,让空间计算赋能现场决策
  • 尝试对音频功率放大器芯片的噪声基底特性进行测量与计算:以纳芯威NS4268为例
  • 3.1 策略梯度方法(Policy Gradient Methods)