UOJ 164【清华集训2015】V Solution

Description

给定序列 a = ( a 1 , a 2 , ⋯ , a n ) a=(a_1,a_2,\cdots,a_n) a=(a1,a2,,an),另有序列 h h h,初始时 h = a h=a h=a.
m m m 个操作分五种:

  • add ⁡ ( l , r , v ) \operatorname{add}(l,r,v) add(l,r,v):对每个 i ∈ [ l , r ] i\in[l,r] i[l,r] 执行 a i ← a i + v a_i\gets a_i+v aiai+v.
  • subtract ⁡ ( l , r , v ) \operatorname{subtract}(l,r,v) subtract(l,r,v):对每个 i ∈ [ l , r ] i\in[l,r] i[l,r] 执行 a i ← max ⁡ ( 0 , a i − v ) a_i\gets \max(0, a_i-v) aimax(0,aiv).
  • assign ⁡ ( l , r , v ) \operatorname{assign}(l,r,v) assign(l,r,v):对每个 i ∈ [ l , r ] i\in[l,r] i[l,r] 执行 a i ← v a_i\gets v aiv.
  • get ⁡ ( i ) \operatorname{get}(i) get(i):求 a i a_i ai.
  • geth ⁡ ( i ) \operatorname{geth}(i) geth(i):求 h i h_i hi.

每次修改后,对每个 i ∈ [ 1 , n ] i\in[1,n] i[1,n] 执行 h i ← max ⁡ ( h i , a i ) h_i\gets \max(h_i,a_i) himax(hi,ai).

Limitations

1 ≤ n , m ≤ 5 × 1 0 5 1\le n,m\le 5\times 10^5 1n,m5×105
0 ≤ a i , v ≤ 1 0 9 0\le a_i,v\le 10^9 0ai,v109
1 ≤ l , r , i ≤ n 1\le l,r,i\le n 1l,r,in
2 s , 128 MB 2\text{s},128\text{MB} 2s,128MB

Solution

显然使用线段树.
由于带有 chmax ⁡ \operatorname{chmax} chmax,每个节点维护标记 ( k , b ) (k,b) (k,b) 表示 x x x 变为 max ⁡ ( x + k , b ) \max(x+k,b) max(x+k,b).
那么三种修改可以如下表示:

  • add ⁡ \operatorname{add} add 操作: ( v , − ∞ ) (v,-\infty) (v,).
  • subtract ⁡ \operatorname{subtract} subtract 操作: ( − v , 0 ) (-v,0) (v,0).
  • assign ⁡ \operatorname{assign} assign 操作: ( − ∞ , v ) (-\infty,v) (,v).

由于需要求 h i h_i hi,还需要维护历史值的标记 ( hk , hb ) (\textit{hk},\textit{hb}) (hk,hb).
考虑合并,画出图像(我画不好不献丑了),可得:

  • ( k 0 , b 0 ) + ( k 1 , b 1 ) = ( k 0 + k 1 , max ⁡ ( b 0 + k 1 , b 1 ) ) (k_0,b_0)+(k_1,b_1)=(k_0+k_1,\max(b_0+k_1,b_1)) (k0,b0)+(k1,b1)=(k0+k1,max(b0+k1,b1)).
  • ( hk 0 , hb 0 ) + ( hk 1 , hb 1 ) = ( max ⁡ ( hk 0 , k 0 + hk 1 ) , max ⁡ ( hb 0 , hb 1 , b 0 + hk 1 ) ) (\textit{hk}_0,\textit{hb}_0)+(\textit{hk}_1,\textit{hb}_1)=(\max(\textit{hk}_0,k_0+\textit{hk}_1),\max(\textit{hb}_0,\textit{hb}_1,b_0+\textit{hk}_1)) (hk0,hb0)+(hk1,hb1)=(max(hk0,k0+hk1),max(hb0,hb1,b0+hk1)).

查询时直接取出点 i i i 的标记,计算即可.
注意幺元 e = ( 0 , − ∞ ) e=(0,-\infty) e=(0,),合并 k k k 时需要和 − ∞ -\infty max ⁡ \max max,以及开 long long.

Code

3 KB , 2.93 s , 45.11 MB (in total, C++ 20) 3\text{KB},2.93\text{s},45.11\text{MB}\;\texttt{(in total, C++ 20)} 3KB,2.93s,45.11MB(in total, C++ 20)

#include <bits/stdc++.h>
using namespace std;using i64 = long long;
using ui64 = unsigned long long;
using i128 = __int128;
using ui128 = unsigned __int128;
using f4 = float;
using f8 = double;
using f16 = long double;template<class T>
bool chmax(T &a, const T &b){if(a < b){ a = b; return true; }return false;
}template<class T>
bool chmin(T &a, const T &b){if(a > b){ a = b; return true; }return false;
}constexpr i64 inf = 2e18;
namespace seg_tree {struct Tag {i64 hk, hb, k, b;inline Tag() : hk(0), hb(-inf), k(0), b(-inf) {}inline Tag(i64 _hk, i64 _hb, i64 _k, i64 _b) : hk(_hk), hb(_hb), k(_k), b(_b) {}inline void apply(const Tag& t) {hk = max(hk, k + t.hk);hb = max(hb, max(b + t.hk, t.hb));k = max(k + t.k, -inf);b = max(b + t.k, t.b);}inline i64 f(i64 x) { return max(k + x, b); }inline i64 g(i64 x) { return max(hk + x, hb); }};struct Node {int l, r;Tag tag;};inline int ls(int u) { return 2 * u + 1; }inline int rs(int u) { return 2 * u + 2; }struct SegTree {vector<Node> tr;inline SegTree() {}inline SegTree(int n) : tr(n << 1) { build(0, 0, n - 1); }inline void pushdown(int u, int mid) {tr[ls(mid)].tag.apply(tr[u].tag);tr[rs(mid)].tag.apply(tr[u].tag);tr[u].tag = Tag();}inline void build(int u, int l, int r) {tr[u].l = l, tr[u].r = r, tr[u].tag = Tag();if (l == r) return;const int mid = (l + r) >> 1;build(ls(mid), l, mid), build(rs(mid), mid + 1, r);}inline void update(int u, int l, int r, i64 k, i64 b) {if (l <= tr[u].l && tr[u].r <= r) return tr[u].tag.apply(Tag(k, b, k, b));const int mid = (tr[u].l + tr[u].r) >> 1;pushdown(u, mid);if (l <= mid) update(ls(mid), l, r, k, b);if (r > mid) update(rs(mid), l, r, k, b);}inline Tag get(int u, int p) {if (tr[u].l == tr[u].r) return tr[u].tag;const int mid = (tr[u].l + tr[u].r) >> 1;pushdown(u, mid);if (p <= mid) return get(ls(mid), p);else return get(rs(mid), p);}inline void range_add(int l, int r, i64 x) { update(0, l, r, x, -inf); }inline void range_sub(int l, int r, i64 x) { update(0, l, r, -x, 0); }inline void range_assign(int l, int r, i64 x) { update(0, l, r, -inf, x); }inline Tag get(int p) { return get(0, p); }};
}
using seg_tree::SegTree;signed main() {ios::sync_with_stdio(0);cin.tie(0), cout.tie(0);int n, m;scanf("%d %d", &n, &m);vector<i64> a(n);for (int i = 0; i < n; i++) scanf("%lld", &a[i]);SegTree sgt(n);for (int i = 0, op; i < m; i++) {scanf("%d", &op);if (op <= 3) {int l, r; i64 k;scanf("%d %d %lld", &l, &r, &k), l--, r--;if (op == 1) sgt.range_add(l, r, k);if (op == 2) sgt.range_sub(l, r, k);if (op == 3) sgt.range_assign(l, r, k);}else {int x; scanf("%d", &x), x--;auto tag = sgt.get(x);if (op == 4) printf("%lld\n", tag.f(a[x]));if (op == 5) printf("%lld\n", tag.g(a[x]));}}return 0;
}

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

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

相关文章

C++开发过程中的注意事项详解

目录 C++开发过程中的注意事项详解 一、内存管理:避免泄漏与资源浪费 1.1 使用智能指针管理动态内存 1.2 避免手动内存管理的陷阱 1.3 利用RAII机制管理资源 1.4 容器与内存分配 二、安全性:防御攻击与未定义行为 2.1 输入验证与安全编码 2.2 使用安全的通信协议 2…

Git 时光机:修改Commit信息

前言 列位看官都知道&#xff0c;Git 的每一次 git commit&#xff0c;其中会包含作者&#xff08;Author&#xff09;和提交者&#xff08;Committer&#xff09;的姓名与邮箱。有时可能会因为配置错误、切换了开发环境&#xff0c;或者只是单纯的手滑&#xff0c;导致 commi…

QSFP+、QSFP28、QSFP-DD接口分别实现40G、100G、200G/400G以太网接口

常用的光模块结构形式&#xff1a; 1&#xff09;QSFP等效于4个SFP&#xff0c;支持410Gbit/s通道传输&#xff0c;可通过4个通道实现40Gbps传输速率。与SFP相比&#xff0c;QSFP光模块的传输速率可达SFP光模块的四倍&#xff0c;在部署40G网络时可直接使用QSFP光模块&#xf…

好用的播放器推荐

以下是一些好用的播放器推荐&#xff0c;按照不同平台和使用场景分类&#xff1a; 电脑端 VLC Media Player 特点&#xff1a;开源、跨平台&#xff0c;支持几乎所有的音视频格式&#xff0c;无需额外安装解码器。具备强大的功能&#xff0c;如播放列表管理、视频和音频滤镜、…

Vue基础(8)_监视属性、深度监视、监视的简写形式

监视属性(watch)&#xff1a; 1.当被监视的属性变化时&#xff0c;回调函数(handler)自动调用&#xff0c;进行相关操作。 2.监视的属性必须存在&#xff0c;才能进行监视&#xff01;&#xff01; 3.监视的两种写法&#xff1a; (1).new Vue时传入watch配置 (2).通过vm.$watc…

AI服务器的作用都有哪些?

根据网络环境的飞速发展&#xff0c;人工智能技术逐渐入驻到各个行业当中&#xff0c;其中AI服务器则是一种专门用来运行人工智能算法和模型的硬件设备&#xff0c;通常具备高性能计算、大容量存储和并行计算等多种功能&#xff0c;本文就来详细讲解一下AI服务器的作用&#xf…

[250508] Linux 内核瘦身:弃用 i486 及早期 586 CPU 支持

目录 Linux 内核计划精简&#xff1a;将移除对古董级 CPU 的支持 Linux 内核计划精简&#xff1a;将移除对古董级 CPU 的支持 核心动态&#xff1a; Linux 内核开发社区正计划一项重要的代码清理工作&#xff0c;目标是移除对非常古老的 i486 及早期 586 (如早期奔腾) CPU 架构…

ROM详解

一、ROM基础原理 定义与特性 ROM&#xff08;Read-Only Memory&#xff0c;只读存储器&#xff09;是一种非易失性存储器&#xff0c;数据在制造或编程后永久保存&#xff0c;断电后不丢失。其核心特性为数据不可修改&#xff08;或需特殊条件修改&#xff09;。 存储原理&…

解决虚拟机挂起之后的网络问题

相信很多人都有遇到过自己在VM上面手滑点了个挂起然后就连不了网络的情况吧&#xff0c;我也遇到了&#xff0c;下面是我的解决办法&#xff0c;希望对大家有所帮助&#xff01; 我运行完如下&#xff1a; 基本上出现绿色的就说明网络连上啦&#xff01;

在Star-CCM+中实现UDF并引用场数据和网格数据

在Star-CCM中实现UDF并引用场数据和网格数据 Star-CCM中的用户自定义函数(UDF)允许用户通过Java或C/C编程扩展软件功能。下面我将详细介绍如何实现UDF并引用模拟数据。 1. UDF基础实现方法 1.1 创建UDF的步骤 在Star-CCM中&#xff0c;右键点击"工具" → “用户函…

ConnectionResetError(10054, ‘远程主机强迫关闭了一个现有的连接,Python爬虫

文章目录 ConnectionResetError(10054, 远程主机强迫关闭了一个现有的连接1.问题描述2.尝试的解决方法&#xff08;均未生效&#xff09;2.1 请求重试机制2.2 模拟浏览器请求头2.3 关闭连接资源2.4 延迟访问 3.解决方案&#xff1a;使用 proxy_pool IP 代理池最后参考文章 Conn…

Redis相关命令详解与原理(一)

目录 Redis是什么&#xff1f; Redis 的特点和功能 Redis工作模式 与MySQL的区别 安装编译和启动 redis的value类型编码 string类型 基础命令 应用 1.对象存储 2.累加器 3.分布式锁 4.位运算 list类型 基础命令 应用 1.栈&#xff08;先进后出 FILO&#xff0…

Starrocks 的 ShortCircuit短路径

背景 本文基于 Starrocks 3.3.5 本文主要来探索一下Starrocks在FE端怎么实现 短路径&#xff0c;从而加速点查查询速度。 在用户层级需要设置 enable_short_circuit 为true 分析 数据流&#xff1a; 直接到StatementPlanner.createQueryPlan方法&#xff1a; ... OptExpres…

Oracle非归档模式遇到文件损坏怎么办?

昨天夜里基地夜班的兄弟&#xff0c;打电话说有个报表库连不上了&#xff0c;赶紧起来连上VPN查看一下&#xff0c;看到实例宕机了&#xff0c;先赶紧startup起来。 1.查看报错信息 环境介绍&#xff1a;Redhat 6.9 Oracle 11.2.0.4 No Archive Mode 查看alert log 关键报…

关于一些平时操作系统或者软件的步骤转载

关于一些平时操作系统或者软件的步骤转载 关于python环境搭建 关于Ubuntu 1. 双系统之Ubuntu快速卸载 2. VMware安装Ubuntu虚拟机实现COpenCV代码在虚拟机下运行教程 3. ubuntu 下 opencv的安装以及配置&#xff08;亲测有效&#xff09; 4. Ubuntu将c编译成.so文件并测试 5…

hz2新建Keyword页面

新建一个single-keywords.php即可&#xff0c;需要筛选项再建taxonomy-knowledge-category.php 参考&#xff1a;https://www.tkwlkj.com/customize-wordpress-category-pages.html WordPress中使用了ACF创建了自定义产品分类products&#xff0c;现在想实现自定义产品分类下的…

VRRP协议-IP地址冗余配置

有两个服务器172.16.42.1和172.16.42.121&#xff0c;通过VRRP协议使两台设备共用一个虚拟地址172.16.42.100&#xff0c;当 172.16.42.1 可用时&#xff0c;它会作为主路由器使用虚拟 IP 地址&#xff1b;当它不可用时&#xff0c;172.16.42.121 会接管虚拟 IP 地址&#xff0…

21、DeepSeekMath论文笔记(GRPO)

DeepSeekMath论文笔记 0、研究背景与目标1、GRPO结构GRPO结构PPO知识点**1. PPO的网络模型结构****2. GAE&#xff08;广义优势估计&#xff09;原理****1. 优势函数的定义**2.GAE&#xff08;广义优势估计&#xff09; 2、关键技术与方法3、核心实验结果4、结论与未来方向关键…

卡尔曼滤波算法(C语言)

此处感谢华南虎和互联网的众多大佬的无偿分享。 入门常识 先简单了解以下概念&#xff1a;叠加性&#xff0c;齐次性。 用大白话讲&#xff0c;叠加性&#xff1a;多个输入对输出有影响。齐次性&#xff1a;输入放大多少倍&#xff0c;输出也跟着放大多少倍 卡尔曼滤波符合这…

SolidWork-2023 鼠標工程

地址 https://github.com/MartinxMax/SW2023-Project/tree/main/mouse 鼠標