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

洛谷 P4314

区间加,区间修改,求区间最大值/历史最大值。

\(n, T \le 10^5\)

好久没有紫题让我卡 \(4h\),跨一天才写出来的紫题了。刷新了我对懒标记的认知。

考虑如果没有求历史最大值这个事情,还是比较简单的,打 f, to, add 的赋值和加的 \(tag\) 即可(\(f\) 是是否有赋值操作),合并 \(tag\) 也相当容易。

但有了查历史最大值,事情就没有那么简单了。我们要记录信息:mx, hmx 表示当前最大值以及历史最大值,pushup 很好搞定。关键在于懒标记,可能需要记录 \(5\) 个:f, to, add, mxto, mxadd 表示是否有赋值操作,赋值成为了什么,加了多少,以及历史的中的最大区间赋值以及最大区间加。

然后发现这还不好合并,因为懒标记实际上对应的是一个操作序列,懒标记合并操作相当于将下传的懒标记序列添加到原有懒标记序列后面。如果出现 “赋值, 加,赋值,加, 赋值,.....” 之类的情况,每个赋值操作都要对应一个最大的加,用一个变量显然是无法记录的。

解决方式是,对于一个懒标记来说,只要有了赋值操作,后面的操作都可以看成赋值操作,比如说对于 \([l, r]\) 先赋值为 \(v\),再区间加 \(k\),相当于先赋值成 \(v\),再赋值为 \(v + k\)。这样一个懒标记可以分成前后两部分,前面是加法,后面是赋值。这样合并起来就比较舒服了。具体见代码。

实现时可以单开一个结构体表示懒标记,比较清晰。

struct Tag { // 懒标记bool f;int to, add, mxto, mxadd; // 如上述含义
};struct SegTree {int mx, hmx;Tag t;
} tr[MAXN * 4]; int n, T, a[MAXN];void update(int x, Tag &t) {if (!tr[x].t.f) { // 只有原有懒标记序列全是加法,才可以。而 (加 + 赋) + 加,两个加是不可以合并的。tr[x].t.mxadd = max(tr[x].t.mxadd, tr[x].t.add + t.mxadd);tr[x].t.add += t.add;}if (t.f) { // 赋值操作tr[x].t.mxto = max({tr[x].t.mxto, tr[x].t.to + t.mxadd, t.mxto}); // 加 + 赋 + 加 + 赋tr[x].t.to = t.to, tr[x].hmx = max({tr[x].mx + t.mxadd, tr[x].hmx, t.mxto});tr[x].mx = t.to, tr[x].t.f = 1;} else {tr[x].hmx = max(tr[x].hmx, tr[x].mx + t.mxadd), tr[x].mx += t.add;if (tr[x].t.f) { // 将 赋值 + 加 操作变成赋值操作tr[x].t.mxto = max(tr[x].t.mxto, tr[x].t.to + t.mxadd);tr[x].t.to += t.add;}}
}

懒标记实际对应的是一个序列,如何将连个懒标记序列合并是 pushdown 的关键,需要具体问题具体分析。没怎么见过可能脑子会变成一坨浆糊。

http://www.jsqmd.com/news/120359/

相关文章:

  • 【计算机毕业设计案例】基于springboot的物业报修系统的设计与实现线上化的报修管理平台(程序+文档+讲解+定制)
  • 2025年上海办公室装修全景指南:从规划布局到服务商甄选的权威解析 - 小白条111
  • 【毕业设计】基于springboot的影视同人创作与分享平台系统(源码+文档+远程调试,全bao定制等)
  • 2025年儿童鞋服口碑榜单出炉!从运动机能到时尚穿搭,这十大品牌承包孩子的成长衣橱 - 品牌测评鉴赏家
  • 用 .NET MAUI 10 + VS Copilot 从 0 开发一个签到 App(八)复盘 —— Copilot 在 MAUI 项目中的真实边界
  • 【计算机毕业设计案例】基于springboot的幼儿园管理系统的设计与实现活动信息、课程信息、菜谱信息(程序+文档+讲解+定制)
  • Java毕设项目:基于springboot的在线招标系统的设计与实现(源码+文档,讲解、调试运行,定制等)
  • 宝妈宝爸必看!超赞儿童鞋服家居服品牌大赏 - 品牌测评鉴赏家
  • AI原生应用开发效率提升:这些工具让你事半功倍
  • 【课程设计/毕业设计】基于springboot的影视同人创作与分享平台系统构建 “创作发布 - 社区互动 - 版权管理” 的一体化平台【附源码、数据库、万字文档】
  • 为什么基于selenium实现浏览器自动化操作的时候,建议搭配webdriverManager使用。
  • Java毕设项目:基于springboot的社区团购系统的设计与实现(源码+文档,讲解、调试运行,定制等)
  • 【计算机毕业设计案例】基于springboot的在线招标系统的设计与实现构建 “招标管理 - 投标响应 - 开标评标 - 结果公示 - 档案归档” 一体化平台(程序+文档+讲解+定制)
  • 【毕业设计】基于springboot的社区团购系统的设计与实现(源码+文档+远程调试,全bao定制等)
  • 计算机Java毕设实战-基于springboot的幼儿园管理系统的设计与实现基于Springboot+vue的幼儿园管理系统设计与实现【完整源码+LW+部署说明+演示视频,全bao一条龙等】
  • 解码QPixmap 图片自适应控件缩放与圆角处理
  • 2025年中国十大童装品牌盘点:品质与时尚兼具,守护孩子童年风采 - 品牌测评鉴赏家
  • Java计算机毕设之基于springboot的社区团购系统的设计与实现基于springboot的社区生鲜团购系统(完整前后端代码+说明文档+LW,调试定制等)
  • 小童童装选购全攻略:从品牌到穿搭,新手爸妈必看指南 - 品牌测评鉴赏家
  • 【毕业设计】基于springboot的物业报修系统的设计与实现(源码+文档+远程调试,全bao定制等)
  • 计算机Java毕设实战-基于SpringBoot与Vue的在线招投标系统设计与实现基于springboot的在线招标系统的设计与实现【完整源码+LW+部署说明+演示视频,全bao一条龙等】
  • 堆排序和topk问题
  • 【计算机毕业设计案例】基于SpringBoot的社区线上团购系统设计与实现基于springboot的社区团购系统的设计与实现(程序+文档+讲解+定制)
  • 2025年终优选:0-16岁儿童鞋服宝藏品牌大公开 - 品牌测评鉴赏家
  • 【MTSP问题】基于螳螂虾算法MShOA求解单仓库多旅行商问题附Matlab代码
  • Java计算机毕设之基于springboot的物业报修系统的设计与实现住户信息管理、报修处理、费用收缴(完整前后端代码+说明文档+LW,调试定制等)
  • LLMs、RAG、AI Agent 三个到底什么区别?
  • 这段代码中的 ttl是做什么的
  • 【NWFSP问题】基于雪橇犬算法SDO求解零等待流水车间调度问题NWFSP附Matlab代码
  • ES知识点二