P10638 BZOJ4355 Play with sequence Solution
Description
给定 a = ( a 1 , a 2 , ⋯ , a n ) a=(a_1,a_2,\cdots,a_n) a=(a1,a2,⋯,an),有 m m m 个操作,分以下三种:
- assign ( l , r , k ) \operatorname{assign}(l,r,k) assign(l,r,k):对每个 i ∈ [ l , r ] i \in[l,r] i∈[l,r] 执行 a i ← k a_i \leftarrow k ai←k.
- modify ( l , r , k ) \operatorname{modify}(l,r,k) modify(l,r,k):对每个 i ∈ [ l , r ] i \in[l,r] i∈[l,r] 执行 a i ← m a x ( a i + c , 0 ) a_i \leftarrow max(a_i+c,0) ai←max(ai+c,0).
- query ( l , r ) \operatorname{query}(l,r) query(l,r):求 ∑ i = l r [ a i = 0 ] \sum\limits_{i=l}^r [a_i=0] i=l∑r[ai=0].
Limitations
1 ≤ n , m ≤ 3 × 1 0 5 1 \le n,m \le 3\times 10^5 1≤n,m≤3×105
0 ≤ a i ≤ 1 0 9 0 \le a_i \le 10^9 0≤ai≤109
0 ≤ k ≤ 1 0 9 0 \le k \le 10^9 0≤k≤109 ( assign \operatorname{assign} assign)
∣ k ∣ ≤ 1 0 9 |k| \le 10^9 ∣k∣≤109 ( modify \operatorname{modify} modify)
1.5 s , 512 MB 1.5\text{s},512\text{MB} 1.5s,512MB
Solution
看到区间最值,想到吉司机线段树.
考虑转化每个操作:
- assign \operatorname{assign} assign:来一次 chmax \operatorname{chmax} chmax,再来一次 chmin \operatorname{chmin} chmin .
- modify \operatorname{modify} modify:来一次 add \operatorname{add} add,再来一次 chmax \operatorname{chmax} chmax .
- query \operatorname{query} query:由于 a i a_i ai 非负,只需看最小值是否为 0 0 0,再看出现次数.
接下来只需把 P10639 代码拉过来改一下即可。
Code
5.85 KB , 1.66 s , 94.47 MB (in total, C++ 20 with O2) 5.85\text{KB},1.66\text{s},94.47\text{MB}\;\texttt{(in total, C++ 20 with O2)} 5.85KB,1.66s,94.47MB(in total, C++ 20 with O2)
// Problem: P10638 BZOJ4355 Play with sequence
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/P10638
// Memory Limit: 512 MB
// Time Limit: 1500 ms
//
// Powered by CP Editor (https://cpeditor.org)#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;
}const i64 inf = 3e18;
struct Node {int l, r, cmax, cmin;i64 max, max2, min, min2;i64 tag, tmin, tmax, sum;
};
using Tree = vector<Node>;
inline int ls(int u) { return 2 * u + 1; }
inline int rs(int u) { return 2 * u + 2; }inline void pushup(Tree& tr, int u) {tr[u].sum = tr[ls(u)].sum + tr[rs(u)].sum;if (tr[ls(u)].max == tr[rs(u)].max) {tr[u].max = tr[ls(u)].max;tr[u].cmax = tr[ls(u)].cmax + tr[rs(u)].cmax;tr[u].max2 = max(tr[ls(u)].max2, tr[rs(u)].max2);}else if (tr[ls(u)].max > tr[rs(u)].max) {tr[u].max = tr[ls(u)].max;tr[u].cmax = tr[ls(u)].cmax;tr[u].max2 = max(tr[ls(u)].max2, tr[rs(u)].max);}else {tr[u].max = tr[rs(u)].max;tr[u].cmax = tr[rs(u)].cmax;tr[u].max2 = max(tr[ls(u)].max, tr[rs(u)].max2);}if (tr[ls(u)].min == tr[rs(u)].min) {tr[u].min = tr[ls(u)].min;tr[u].cmin = tr[ls(u)].cmin + tr[rs(u)].cmin;tr[u].min2 = min(tr[ls(u)].min2, tr[rs(u)].min2);}else if (tr[ls(u)].min < tr[rs(u)].min) {tr[u].min = tr[ls(u)].min;tr[u].cmin = tr[ls(u)].cmin;tr[u].min2 = min(tr[ls(u)].min2, tr[rs(u)].min);}else {tr[u].min = tr[rs(u)].min;tr[u].cmin = tr[rs(u)].cmin;tr[u].min2 = min(tr[ls(u)].min, tr[rs(u)].min2);}
}inline void build(Tree& tr, int u, int l, int r, const vector<i64>& A) {tr[u].l = l;tr[u].r = r;tr[u].tmin = inf;tr[u].tmax = -inf;if (l == r) {tr[u].sum = tr[u].max = tr[u].min = A[l];tr[u].max2 = -inf;tr[u].min2 = inf;tr[u].cmax = tr[u].cmin = 1;return;}const int mid = (l + r) >> 1;build(tr, ls(u), l, mid, A);build(tr, rs(u), mid + 1, r, A);pushup(tr, u);
}inline void upd_add(Tree& tr, int u, i64 val) {tr[u].sum += val * (tr[u].r - tr[u].l + 1);tr[u].max += val;tr[u].min += val;if (tr[u].max2 != -inf) tr[u].max2 += val;if (tr[u].min2 != inf) tr[u].min2 += val;if (tr[u].tmax != -inf) tr[u].tmax += val;if (tr[u].tmin != inf) tr[u].tmin += val;tr[u].tag += val;
}inline void upd_min(Tree& tr, int u, i64 val) {if (tr[u].max <= val) return;tr[u].sum += (val - tr[u].max) * tr[u].cmax;if (tr[u].min2 == tr[u].max) tr[u].min2 = val;if (tr[u].min == tr[u].max) tr[u].min = val;tr[u].tmax = min(tr[u].tmax, val);tr[u].max = val;tr[u].tmin = val;
}inline void upd_max(Tree& tr, int u, i64 val) {if (tr[u].min > val) return;tr[u].sum += (val - tr[u].min) * tr[u].cmin;if (tr[u].max2 == tr[u].min) tr[u].max2 = val; if (tr[u].max == tr[u].min) tr[u].max = val;tr[u].tmin = max(tr[u].tmin, val);tr[u].min = val;tr[u].tmax = val;
}inline void pushdown(Tree& tr, int u) {if (tr[u].tag) {upd_add(tr, ls(u), tr[u].tag);upd_add(tr, rs(u), tr[u].tag);}if (tr[u].tmax != -inf) {upd_max(tr, ls(u), tr[u].tmax);upd_max(tr, rs(u), tr[u].tmax);}if (tr[u].tmin != inf) {upd_min(tr, ls(u), tr[u].tmin);upd_min(tr, rs(u), tr[u].tmin);}tr[u].tag = 0;tr[u].tmax = -inf;tr[u].tmin = inf;
}inline void add(Tree& tr, int u, int l, int r, i64 val) {if (l <= tr[u].l && tr[u].r <= r) return upd_add(tr, u, val);const int mid = (tr[u].l + tr[u].r) >> 1;pushdown(tr, u);if (l <= mid) add(tr, ls(u), l, r, val);if (r > mid) add(tr, rs(u), l, r, val);pushup(tr, u);
}inline void chmin(Tree& tr, int u, int l, int r, i64 val) {if (tr[u].max <= val) return;if (l <= tr[u].l && tr[u].r <= r && tr[u].max2 < val) return upd_min(tr, u, val);const int mid = (tr[u].l + tr[u].r) >> 1;pushdown(tr, u);if (l <= mid) chmin(tr, ls(u), l, r, val);if (r > mid) chmin(tr, rs(u), l, r, val);pushup(tr, u);
}inline void chmax(Tree& tr, int u, int l, int r, i64 val) {if (tr[u].min >= val) return;if (l <= tr[u].l && tr[u].r <= r && tr[u].min2 > val) return upd_max(tr, u, val);const int mid = (tr[u].l + tr[u].r) >> 1;pushdown(tr, u);if (l <= mid) chmax(tr, ls(u), l, r, val);if (r > mid) chmax(tr, rs(u), l, r, val);pushup(tr, u);
}inline int query(Tree& tr, int u, int l, int r) {if (tr[u].min > 0) return 0;if (l <= tr[u].l && tr[u].r <= r) return tr[u].cmin;const int mid = (tr[u].l + tr[u].r) >> 1;pushdown(tr, u);if (r <= mid) return query(tr, ls(u), l, r);else if (l > mid) return query(tr, rs(u), l, r);else return query(tr, ls(u), l, r) + query(tr, rs(u), l, r);
}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]);Tree tr(n << 2);build(tr, 0, 0, n - 1, a);for (int i = 0, op, l, r, v; i < m; i++) {scanf("%d %d %d", &op, &l, &r);l--, r--;if (op == 1) {scanf("%d", &v);chmax(tr, 0, l, r, v);chmin(tr, 0, l, r, v);}if (op == 2) {scanf("%d", &v);add(tr, 0, l, r, v);chmax(tr, 0, l, r, 0);}if (op == 3) {printf("%d\n", query(tr, 0, l, r));}}return 0;
}
相关文章:
P10638 BZOJ4355 Play with sequence Solution
Description 给定 a ( a 1 , a 2 , ⋯ , a n ) a(a_1,a_2,\cdots,a_n) a(a1,a2,⋯,an),有 m m m 个操作,分以下三种: assign ( l , r , k ) \operatorname{assign}(l,r,k) assign(l,r,k):对每个 i ∈ [ l , r ] i \…...
MySQL误删数据怎么办?
文章目录 1. 从备份恢复数据2. 通过二进制日志恢复数据3. 使用数据恢复工具4. 利用事务回滚恢复数据5. 预防误删数据的策略总结 在使用MySQL进行数据管理时,误删数据是一个常见且具有高风险的操作。无论是因为操作失误、系统故障,还是不小心执行了删除命…...
项目测试之MockMvc
文章目录 基础基础概念Mockxxx一般实现文件位置 实战MockMvc与Test注解不兼容RequestParams参数RequestBody参数 基础 基础概念 定义:是Spring框架提供的一种用于测试Spring MVC控制器的工具,它允许开发者在不启动完整的web服务器的情况下,…...
Unbutu虚拟机+eclipse+CDT编译调试环境搭建
问题1: 安装CDT,直接Help->eclipse Market space-> 搜cdt , install,等待重启即可. 问题2:C变量不识别vector ’could not be resolved 这是库的头文件没加好,右键Properties->C Build->Enviroment,增加…...
时间轮:XXL-JOB 高效、精准定时任务调度实现思路分析
大家好,我是此林。 定时任务是我们项目中经常会遇到的一个场景。那么如果让我们手动来实现一个定时任务框架,我们会怎么做呢? 1. 基础实现:简单的线程池时间轮询 最直接的方式是创建一个定时任务线程池,用户每提交一…...
CTF-web: Python YAML反序列化利用
PyYAML存在以下几个特殊标签,如果这些标签被不安全的解析,会造成解析漏洞 从 PyYaml 版本 6.0 开始,load 的默认加载器已切换到 SafeLoader,以降低远程代码执行的风险。更新后易受攻击的是 yaml.unsafe_load 和 yaml.load(input, Loaderyaml.UnsafeLoade…...
代码随想录算法训练营第三十八天-动态规划-完全背包-139.单词拆分
类似于回溯算法中的拆分回文串题目是要求拆分字符串,问这些字符串是否出现在字典里。但这道题可以反着来考虑,从字典中的单词能不能组成所给定的字符串 如果这样考虑, 这个字符串就背包,容器字典中的单词就是一个一个物品问题就转…...
ML基础-Jupyter notebook中的魔法命令
在 Jupyter Notebook 或 IPython 环境中,“魔法命令”(Magic Commands)是一些以百分号(%)或惊叹号(!)开头的特殊命令,用于执行一些与代码运行环境相关的操作,而不仅仅是执行普通的 P…...
Zookeeper入门部署(单点与集群)
本篇文章基于docker方式部署zookeeper集群,请先安装docker 目录 1. docker初期准备 2.启动zookeeper 2.1 单点部署 2.2 集群部署 3. Linux脚本实现快速切换启动关闭 1. docker初期准备 拉取zookeeper镜像 docker pull zookeeper:3.5.6 如果拉取时间过长…...
Kafa分区策略实现
引言 Kafka 的分区策略决定了生产者发送的消息会被分配到哪个分区中,合理的分区策略有助于实现负载均衡、提高消息处理效率以及满足特定的业务需求。 轮询策略(默认) 轮询策略是 Kafka 默认的分区策略(当消息没有指定键时&…...
Pyside/Pyqt中QWebEngineView和QWebEnginePage的区别
在 PySide/Qt 的 WebEngine 模块中,QWebEngineView 和 QWebEnginePage 是两个紧密相关但职责不同的类。以下是它们的核心区别和关系: 1. 职责区分 类名核心职责模块归属QWebEngineView作为可视化的窗口部件(Widget),负…...
Kafka的内部通信协议
引言 kafka内部用到的常见协议和优缺点可以看看原文 Kafka用到的协议 本文奖详细探究kafka核心通信协议和高性能的关键 网络层通信的实现 基于 Java NIO:Kafka 的网络通信层主要基于 Java NIO 来实现,这使得它能够高效地处理大量的连接和数据传输。…...
强大到工业层面的软件
电脑数据删不干净,简直是一种让人抓狂的折磨!明明已经把文件扔进了回收站,清空了,可那些残留的数据就像牛皮癣一样,怎么也除不掉。这种烦恼简直无处不在,让人从头到脚都感到无比烦躁。 首先,心…...
数据分析和AI丨应对AI实施挑战,工程领域AI应用的五大方法
工程领域的人工智能 (AI) 已经开始发挥价值,低代码和无代码工具正在使曾经仅属于专业数据科学家的 AI 能力变得大众化。 然而,并非工程领域的每个人都能从中受益,使用新的便捷的 AI 工具提高工作效率并不难,…...
54. UDP协议
UDP协议 UDP(User Datagram Protocol,用户数据报协议)是一个无连接的传输层协议,它提供简单的、不可靠的信息传送服务。与TCP(传输控制协议)不同,UDP不提供数据包的排序、错误检查(仅…...
AJAX笔记入门篇
黑马程序员视频地址: 黑马程序员前端AJAX入门到实战全套教程https://www.bilibili.com/video/BV1MN411y7pw?vd_source0a2d366696f87e241adc64419bf12cab&spm_id_from333.788.videopod.episodes&p2https://www.bilibili.com/video/BV1MN411y7pw?vd_source…...
深入解析Java集合框架:春招面试要点
在上一篇文章中,我们深入探讨了Java核心基础,这是学习Java的基石。而在实际的Java开发中,集合框架的使用频率极高,它为我们提供了丰富的数据结构和算法实现,极大地提高了开发效率。对于春招面试来说,集合框…...
【Elasticsearch】Elasticsearch的查询
Elasticsearch的查询 DSL查询基础语句叶子查询全文检索查询matchmulti_match 精确查询termrange 复合查询算分函数查询bool查询 排序分页基础分页深度分页 高亮高亮原理实现高亮 RestClient查询基础查询叶子查询复合查询排序和分页高亮 数据聚合DSL实现聚合Bucket聚合带条件聚合…...
STM32 PWM驱动直流电机
接线图: 代码配置: 根据驱动舵机的代码来写,与舵机不同的是,这次的引脚接到了PA2上,所以需要改一下引脚以及改为OC3通道。 另外还需在配置两个GPIO引脚,来控制电机的旋转方向,这里连接到了PA4与…...
系统思考—心智模式
“我们的大脑对连贯性的渴望远胜于对准确性的追求。”—诺贝尔经济学得主丹尼尔卡尼曼 在面对复杂的决策时,我们往往更倾向于寻找那些能够迅速串联起来的信息,而非深入挖掘每一个细节的真实性。这种倾向在日常生活中或许能帮助我们迅速作出决策…...
HunyuanVideo-Foley镜像特性解析:低内存加载方案与显存碎片优化机制
HunyuanVideo-Foley镜像特性解析:低内存加载方案与显存碎片优化机制 1. 镜像概述与核心能力 HunyuanVideo-Foley是一款专为视频生成与音效合成任务优化的私有部署镜像,基于RTX 4090D 24GB显存环境深度调优。该镜像将视频生成与Foley音效生成能力整合在…...
FLUX.1-dev LoRA微调指南:基于像素幻梦输出数据集训练专属风格
FLUX.1-dev LoRA微调指南:基于像素幻梦输出数据集训练专属风格 1. 前言:为什么需要LoRA微调 在像素艺术创作领域,每个艺术家都渴望拥有独特的视觉风格。FLUX.1-dev作为当前最先进的扩散模型,配合像素幻梦(Pixel Dream Workshop)…...
Connect to Oracle Database with JDBC Driver
1. Overview The Oracle Database is one of the most popular relational databases. In this tutorial, we’ll learn how to connect to an Oracle Database using a JDBC Driver. 2. The Database To get us started, we need a database. If we don’t have access to …...
Iceoryx(冰羚):无锁队列与并发控制的设计与实现3(源码解析)
接上篇设计4: 索引管理层( MpmcIndexQueue / CyclicIndex)Subscriber存储数据使用的是queue,是为了保证数据的读取顺序。MpmcLockFreeQueue 为了满足多个进程同时写的情况,采用了索引数据分离的方案(底层的索引实现为 …...
Hunyuan-MT-7B实战教程:OpenWebUI插件开发——添加术语库与记忆功能
Hunyuan-MT-7B实战教程:OpenWebUI插件开发——添加术语库与记忆功能 1. 项目背景与目标 Hunyuan-MT-7B作为腾讯混元开源的70亿参数多语翻译模型,在WMT2025竞赛中斩获30项第一,支持33种语言双向互译,包括5种中国少数民族语言。这…...
新手福音:通过快马平台生成带注释的nap自动化运维脚本快速入门
作为一个刚接触网络自动化运维的新手,第一次看到"深圳网络自动化运维nap"这个概念时,整个人都是懵的。各种专业术语、复杂的协议和库让我望而却步,直到发现了InsCode(快马)平台,才真正找到了入门的好方法。 为什么选择n…...
【Mojo+Python混合部署失效真相】:92%开发者忽略的编译期符号冲突、运行时上下文隔离与调试断点丢失问题
第一章:MojoPython混合部署失效真相全景概览Mojo 作为新兴的高性能系统编程语言,设计初衷是与 Python 生态无缝互操作;然而在真实生产部署中,“Mojo Python 混合部署”常出现静默失败、ABI 不兼容、运行时崩溃或性能断崖式下降等…...
压力型旋流喷嘴内喉部一点横向流体运动
(一)单图逐段解读图 1:0~0.0045s 全时段曲线(含完整瞬态 准稳态)分段特征与机理瞬态冲击段(0~0.0002s)曲线特征:极端剧烈的高频正负震荡,峰值接近 2m/s,是全…...
Meixiong Niannian与SpringBoot微服务架构
Meixiong Niannian与SpringBoot微服务架构 1. 引言 在当今快速发展的AI应用领域,如何将强大的画图引擎无缝集成到企业级系统中是一个关键挑战。Meixiong Niannian作为一款高性能的AI画图引擎,能够生成高质量的图像内容,而SpringBoot微服务架…...
Pixelorama:免费开源的2D精灵编辑器终极指南
Pixelorama:免费开源的2D精灵编辑器终极指南 【免费下载链接】Pixelorama A free & open-source 2D sprite editor, made with the Godot Engine! Available on Windows, Linux, macOS and the Web! 项目地址: https://gitcode.com/gh_mirrors/pi/Pixelorama …...
