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

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 aik.
  • 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) aimax(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=lr[ai=0].

Limitations

1 ≤ n , m ≤ 3 × 1 0 5 1 \le n,m \le 3\times 10^5 1n,m3×105
0 ≤ a i ≤ 1 0 9 0 \le a_i \le 10^9 0ai109
0 ≤ k ≤ 1 0 9 0 \le k \le 10^9 0k109 assign ⁡ \operatorname{assign} assign
∣ k ∣ ≤ 1 0 9 |k| \le 10^9 k109 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​)&#xff0c;有 m m m 个操作&#xff0c;分以下三种&#xff1a; assign ⁡ ( l , r , k ) \operatorname{assign}(l,r,k) assign(l,r,k)&#xff1a;对每个 i ∈ [ l , r ] i \…...

MySQL误删数据怎么办?

文章目录 1. 从备份恢复数据2. 通过二进制日志恢复数据3. 使用数据恢复工具4. 利用事务回滚恢复数据5. 预防误删数据的策略总结 在使用MySQL进行数据管理时&#xff0c;误删数据是一个常见且具有高风险的操作。无论是因为操作失误、系统故障&#xff0c;还是不小心执行了删除命…...

项目测试之MockMvc

文章目录 基础基础概念Mockxxx一般实现文件位置 实战MockMvc与Test注解不兼容RequestParams参数RequestBody参数 基础 基础概念 定义&#xff1a;是Spring框架提供的一种用于测试Spring MVC控制器的工具&#xff0c;它允许开发者在不启动完整的web服务器的情况下&#xff0c;…...

Unbutu虚拟机+eclipse+CDT编译调试环境搭建

问题1: 安装CDT&#xff0c;直接Help->eclipse Market space-> 搜cdt , install&#xff0c;等待重启即可. 问题2&#xff1a;C变量不识别vector ’could not be resolved 这是库的头文件没加好&#xff0c;右键Properties->C Build->Enviroment&#xff0c;增加…...

时间轮:XXL-JOB 高效、精准定时任务调度实现思路分析

大家好&#xff0c;我是此林。 定时任务是我们项目中经常会遇到的一个场景。那么如果让我们手动来实现一个定时任务框架&#xff0c;我们会怎么做呢&#xff1f; 1. 基础实现&#xff1a;简单的线程池时间轮询 最直接的方式是创建一个定时任务线程池&#xff0c;用户每提交一…...

CTF-web: Python YAML反序列化利用

PyYAML存在以下几个特殊标签,如果这些标签被不安全的解析,会造成解析漏洞 从 PyYaml 版本 6.0 开始&#xff0c;load 的默认加载器已切换到 SafeLoader&#xff0c;以降低远程代码执行的风险。更新后易受攻击的是 yaml.unsafe_load 和 yaml.load(input, Loaderyaml.UnsafeLoade…...

代码随想录算法训练营第三十八天-动态规划-完全背包-139.单词拆分

类似于回溯算法中的拆分回文串题目是要求拆分字符串&#xff0c;问这些字符串是否出现在字典里。但这道题可以反着来考虑&#xff0c;从字典中的单词能不能组成所给定的字符串 如果这样考虑&#xff0c; 这个字符串就背包&#xff0c;容器字典中的单词就是一个一个物品问题就转…...

ML基础-Jupyter notebook中的魔法命令

在 Jupyter Notebook 或 IPython 环境中&#xff0c;“魔法命令”&#xff08;Magic Commands&#xff09;是一些以百分号&#xff08;%&#xff09;或惊叹号&#xff08;!)开头的特殊命令&#xff0c;用于执行一些与代码运行环境相关的操作&#xff0c;而不仅仅是执行普通的 P…...

Zookeeper入门部署(单点与集群)

本篇文章基于docker方式部署zookeeper集群&#xff0c;请先安装docker 目录 1. docker初期准备 2.启动zookeeper 2.1 单点部署 2.2 集群部署 3. Linux脚本实现快速切换启动关闭 1. docker初期准备 拉取zookeeper镜像 docker pull zookeeper:3.5.6 如果拉取时间过长&#xf…...

Kafa分区策略实现

引言 Kafka 的分区策略决定了生产者发送的消息会被分配到哪个分区中&#xff0c;合理的分区策略有助于实现负载均衡、提高消息处理效率以及满足特定的业务需求。 轮询策略&#xff08;默认&#xff09; 轮询策略是 Kafka 默认的分区策略&#xff08;当消息没有指定键时&…...

Pyside/Pyqt中QWebEngineView和QWebEnginePage的区别

在 PySide/Qt 的 WebEngine 模块中&#xff0c;QWebEngineView 和 QWebEnginePage 是两个紧密相关但职责不同的类。以下是它们的核心区别和关系&#xff1a; 1. 职责区分 类名核心职责模块归属QWebEngineView作为可视化的窗口部件&#xff08;Widget&#xff09;&#xff0c;负…...

Kafka的内部通信协议

引言 kafka内部用到的常见协议和优缺点可以看看原文 Kafka用到的协议 本文奖详细探究kafka核心通信协议和高性能的关键 网络层通信的实现 基于 Java NIO&#xff1a;Kafka 的网络通信层主要基于 Java NIO 来实现&#xff0c;这使得它能够高效地处理大量的连接和数据传输。…...

强大到工业层面的软件

电脑数据删不干净&#xff0c;简直是一种让人抓狂的折磨&#xff01;明明已经把文件扔进了回收站&#xff0c;清空了&#xff0c;可那些残留的数据就像牛皮癣一样&#xff0c;怎么也除不掉。这种烦恼简直无处不在&#xff0c;让人从头到脚都感到无比烦躁。 首先&#xff0c;心…...

数据分析和AI丨应对AI实施挑战,工程领域AI应用的五大方法

工程领域的人工智能 &#xff08;AI&#xff09; 已经开始发挥价值&#xff0c;低代码和无代码工具正在使曾经仅属于专业数据科学家的 AI 能力变得大众化。 然而&#xff0c;并非工程领域的每个人都能从中受益&#xff0c;使用新的便捷的 AI 工具提高工作效率并不难&#xff0c…...

54. UDP协议

UDP协议 UDP&#xff08;User Datagram Protocol&#xff0c;用户数据报协议&#xff09;是一个无连接的传输层协议&#xff0c;它提供简单的、不可靠的信息传送服务。与TCP&#xff08;传输控制协议&#xff09;不同&#xff0c;UDP不提供数据包的排序、错误检查&#xff08;仅…...

AJAX笔记入门篇

黑马程序员视频地址&#xff1a; 黑马程序员前端AJAX入门到实战全套教程https://www.bilibili.com/video/BV1MN411y7pw?vd_source0a2d366696f87e241adc64419bf12cab&spm_id_from333.788.videopod.episodes&p2https://www.bilibili.com/video/BV1MN411y7pw?vd_source…...

深入解析Java集合框架:春招面试要点

在上一篇文章中&#xff0c;我们深入探讨了Java核心基础&#xff0c;这是学习Java的基石。而在实际的Java开发中&#xff0c;集合框架的使用频率极高&#xff0c;它为我们提供了丰富的数据结构和算法实现&#xff0c;极大地提高了开发效率。对于春招面试来说&#xff0c;集合框…...

【Elasticsearch】Elasticsearch的查询

Elasticsearch的查询 DSL查询基础语句叶子查询全文检索查询matchmulti_match 精确查询termrange 复合查询算分函数查询bool查询 排序分页基础分页深度分页 高亮高亮原理实现高亮 RestClient查询基础查询叶子查询复合查询排序和分页高亮 数据聚合DSL实现聚合Bucket聚合带条件聚合…...

STM32 PWM驱动直流电机

接线图&#xff1a; 代码配置&#xff1a; 根据驱动舵机的代码来写&#xff0c;与舵机不同的是&#xff0c;这次的引脚接到了PA2上&#xff0c;所以需要改一下引脚以及改为OC3通道。 另外还需在配置两个GPIO引脚&#xff0c;来控制电机的旋转方向&#xff0c;这里连接到了PA4与…...

系统思考—心智模式

“我们的大脑对连贯性的渴望远胜于对准确性的追求。”—诺贝尔经济学得主丹尼尔卡尼曼 在面对复杂的决策时&#xff0c;我们往往更倾向于寻找那些能够迅速串联起来的信息&#xff0c;而非深入挖掘每一个细节的真实性。这种倾向在日常生活中或许能帮助我们迅速作出决策&#xf…...

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…...

C++初阶-list的底层

目录 1.std::list实现的所有代码 2.list的简单介绍 2.1实现list的类 2.2_list_iterator的实现 2.2.1_list_iterator实现的原因和好处 2.2.2_list_iterator实现 2.3_list_node的实现 2.3.1. 避免递归的模板依赖 2.3.2. 内存布局一致性 2.3.3. 类型安全的替代方案 2.3.…...

Spark 之 入门讲解详细版(1)

1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室&#xff08;Algorithms, Machines, and People Lab&#xff09;开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目&#xff0c;8个月后成为Apache顶级项目&#xff0c;速度之快足见过人之处&…...

React Native 开发环境搭建(全平台详解)

React Native 开发环境搭建&#xff08;全平台详解&#xff09; 在开始使用 React Native 开发移动应用之前&#xff0c;正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南&#xff0c;涵盖 macOS 和 Windows 平台的配置步骤&#xff0c;如何在 Android 和 iOS…...

基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容

基于 ​UniApp + WebSocket​实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配​微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...

理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端

&#x1f31f; 什么是 MCP&#xff1f; 模型控制协议 (MCP) 是一种创新的协议&#xff0c;旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议&#xff0c;它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...

ESP32读取DHT11温湿度数据

芯片&#xff1a;ESP32 环境&#xff1a;Arduino 一、安装DHT11传感器库 红框的库&#xff0c;别安装错了 二、代码 注意&#xff0c;DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...

【SQL学习笔记1】增删改查+多表连接全解析(内附SQL免费在线练习工具)

可以使用Sqliteviz这个网站免费编写sql语句&#xff0c;它能够让用户直接在浏览器内练习SQL的语法&#xff0c;不需要安装任何软件。 链接如下&#xff1a; sqliteviz 注意&#xff1a; 在转写SQL语法时&#xff0c;关键字之间有一个特定的顺序&#xff0c;这个顺序会影响到…...

python如何将word的doc另存为docx

将 DOCX 文件另存为 DOCX 格式&#xff08;Python 实现&#xff09; 在 Python 中&#xff0c;你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是&#xff0c;.doc 是旧的 Word 格式&#xff0c;而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...

如何在网页里填写 PDF 表格?

有时候&#xff0c;你可能希望用户能在你的网站上填写 PDF 表单。然而&#xff0c;这件事并不简单&#xff0c;因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件&#xff0c;但原生并不支持编辑或填写它们。更糟的是&#xff0c;如果你想收集表单数据&#xff…...