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与…...

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

边缘计算医疗风险自查APP开发方案
核心目标:在便携设备(智能手表/家用检测仪)部署轻量化疾病预测模型,实现低延迟、隐私安全的实时健康风险评估。 一、技术架构设计 #mermaid-svg-iuNaeeLK2YoFKfao {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg…...

vscode(仍待补充)
写于2025 6.9 主包将加入vscode这个更权威的圈子 vscode的基本使用 侧边栏 vscode还能连接ssh? debug时使用的launch文件 1.task.json {"tasks": [{"type": "cppbuild","label": "C/C: gcc.exe 生成活动文件"…...
Go 语言接口详解
Go 语言接口详解 核心概念 接口定义 在 Go 语言中,接口是一种抽象类型,它定义了一组方法的集合: // 定义接口 type Shape interface {Area() float64Perimeter() float64 } 接口实现 Go 接口的实现是隐式的: // 矩形结构体…...

2025盘古石杯决赛【手机取证】
前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来,实在找不到,希望有大佬教一下我。 还有就会议时间,我感觉不是图片时间,因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...

UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)
UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中,UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化…...
docker 部署发现spring.profiles.active 问题
报错: org.springframework.boot.context.config.InvalidConfigDataPropertyException: Property spring.profiles.active imported from location class path resource [application-test.yml] is invalid in a profile specific resource [origin: class path re…...

推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材)
推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材) 这个项目能干嘛? 使用 gemini 2.0 的 api 和 google 其他的 api 来做衍生处理 简化和优化了文生图和图生图的行为(我的最主要) 并且有一些目标检测和切割(我用不到) 视频和 imagefx 因为没 a…...

基于SpringBoot在线拍卖系统的设计和实现
摘 要 随着社会的发展,社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 在线拍卖系统,主要的模块包括管理员;首页、个人中心、用户管理、商品类型管理、拍卖商品管理、历史竞拍管理、竞拍订单…...

深入浅出深度学习基础:从感知机到全连接神经网络的核心原理与应用
文章目录 前言一、感知机 (Perceptron)1.1 基础介绍1.1.1 感知机是什么?1.1.2 感知机的工作原理 1.2 感知机的简单应用:基本逻辑门1.2.1 逻辑与 (Logic AND)1.2.2 逻辑或 (Logic OR)1.2.3 逻辑与非 (Logic NAND) 1.3 感知机的实现1.3.1 简单实现 (基于阈…...

AirSim/Cosys-AirSim 游戏开发(四)外部固定位置监控相机
这个博客介绍了如何通过 settings.json 文件添加一个无人机外的 固定位置监控相机,因为在使用过程中发现 Airsim 对外部监控相机的描述模糊,而 Cosys-Airsim 在官方文档中没有提供外部监控相机设置,最后在源码示例中找到了,所以感…...