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与…...
系统思考—心智模式
“我们的大脑对连贯性的渴望远胜于对准确性的追求。”—诺贝尔经济学得主丹尼尔卡尼曼 在面对复杂的决策时,我们往往更倾向于寻找那些能够迅速串联起来的信息,而非深入挖掘每一个细节的真实性。这种倾向在日常生活中或许能帮助我们迅速作出决策…...
生成xcframework
打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式,可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...
OpenLayers 可视化之热力图
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 热力图(Heatmap)又叫热点图,是一种通过特殊高亮显示事物密度分布、变化趋势的数据可视化技术。采用颜色的深浅来显示…...
PHP和Node.js哪个更爽?
先说结论,rust完胜。 php:laravel,swoole,webman,最开始在苏宁的时候写了几年php,当时觉得php真的是世界上最好的语言,因为当初活在舒适圈里,不愿意跳出来,就好比当初活在…...
在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:
在 HarmonyOS 应用开发中,手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力,既支持点击、长按、拖拽等基础单一手势的精细控制,也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档,…...
【第二十一章 SDIO接口(SDIO)】
第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...
Neo4j 集群管理:原理、技术与最佳实践深度解析
Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...
C# 类和继承(抽象类)
抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...
关于 WASM:1. WASM 基础原理
一、WASM 简介 1.1 WebAssembly 是什么? WebAssembly(WASM) 是一种能在现代浏览器中高效运行的二进制指令格式,它不是传统的编程语言,而是一种 低级字节码格式,可由高级语言(如 C、C、Rust&am…...
代码随想录刷题day30
1、零钱兑换II 给你一个整数数组 coins 表示不同面额的硬币,另给一个整数 amount 表示总金额。 请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额,返回 0 。 假设每一种面额的硬币有无限个。 题目数据保证结果符合 32 位带…...
C++.OpenGL (20/64)混合(Blending)
混合(Blending) 透明效果核心原理 #mermaid-svg-SWG0UzVfJms7Sm3e {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-icon{fill:#552222;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-text{fill…...
