P2572 [SCOI2010] 序列操作 Solution

Description

给定 01 01 01 序列 a = ( a 1 , a 2 , ⋯ , a n ) a=(a_1,a_2,\cdots,a_n) a=(a1,a2,,an),并定义 f ( l , r ) = [ ( ∑ i = l r a i ) = r − l + 1 ] f(l,r)=[(\sum\limits_{i=l}^r a_i)=r-l+1] f(l,r)=[(i=lrai)=rl+1].
执行 m m m 个操作,分五种:

  • reset ⁡ ( l , r ) \operatorname{reset}(l,r) reset(l,r):对每个 i ∈ [ l , r ] i\in[l,r] i[l,r] 执行 a i ← 0 a_i\gets 0 ai0.
  • set ⁡ ( l , r ) \operatorname{set}(l,r) set(l,r):对每个 i ∈ [ l , r ] i\in[l,r] i[l,r] 执行 a i ← 1 a_i\gets 1 ai1.
  • negate ⁡ ( l , r ) \operatorname{negate}(l,r) negate(l,r):对每个 i ∈ [ l , r ] i\in[l,r] i[l,r] 执行 a i ← 1 − a i a_i\gets 1-a_i ai1ai.
  • sum ⁡ ( l , r ) \operatorname{sum}(l,r) sum(l,r):求 ∑ i = l r a i \sum\limits_{i=l}^r a_i i=lrai.
  • gss ⁡ ( l , r ) \operatorname{gss}(l,r) gss(l,r):求 max ⁡ [ s , t ] ∈ [ l , r ] ( t − s + 1 ) × f ( s , t ) \max\limits_{[s,t]\in[l,r]}(t-s+1)\times f(s,t) [s,t][l,r]max(ts+1)×f(s,t).

Limitations

1 ≤ n , m ≤ 1 0 5 1\le n,m\le 10^5 1n,m105
1 ≤ l ≤ r ≤ n 1\le l\le r\le n 1lrn
1 s , 128 MB 1\text{s},128\text{MB} 1s,128MB

Solution

线段树做法.
节点上维护 S = ( sum , lsum , rsum , tsum , len ) S=(\textit{sum},\textit{lsum},\textit{rsum},\textit{tsum},\textit{len}) S=(sum,lsum,rsum,tsum,len),用类似最大子段和的方法更新.
由于要取反, 0 0 0 1 1 1 都分别需要一个 S S S(下记为 S 0 S_0 S0 S 1 S_1 S1) .
然后需要标记 T T T,显然 T = ( cov , rev ) T=(\textit{cov},\textit{rev}) T=(cov,rev)(分别为赋值和取反标记)

  • 考虑赋值,我们直接将 S c o v S_{cov} Scov 全部填上 len \textit{len} len S 1 − c o v S_{1-cov} S1cov 全部清零( len \textit{len} len 要不变)
  • 考虑翻转,我们直接交换 S 0 S_0 S0 S 1 S_1 S1.

然后需要考虑 T + T T+T T+T

  • 赋值可以直接打标记.
  • 对于取反,当一个区间赋值后,取反就相当于赋值 ( 1 − cov ) (1-\textit{cov}) (1cov),那么我们可以将 cov \textit{cov} cov 取反(此时 rev \textit{rev} rev 没用,要置为 0 0 0),否则,直接更新 rev \textit{rev} rev.

有不少坑点:

  • 下标从 0 0 0 开始.
  • 没有被赋值的节点, cov \textit{cov} cov 要置为 − 1 -1 1 表示没有赋值.
  • 更新 S S S 时,左半区间满了, lsum \textit{lsum} lsum 才能跨越中点, rsum \textit{rsum} rsum 同理.
  • 先处理 cov \textit{cov} cov 再处理 rev \textit{rev} rev.
  • rev \textit{rev} rev 标记时 ^= 1 不要写成 = 1.

Code

3.9 KB , 0.45 s , 11.63 MB (in total, C++20 with O2) 3.9\text{KB},0.45\text{s},11.63\text{MB}\;\texttt{(in total, C++20 with O2)} 3.9KB,0.45s,11.63MB(in total, C++20 with O2)
建议封装 S S S(见代码中的 Data),会好写不少.

#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;
}namespace seg_tree {struct Data {int sum, lsum, rsum, tsum, len;inline Data() {}inline Data(int x) : sum(x), lsum(x), rsum(x), tsum(x), len(1) {}inline Data(int _sum, int _lsum, int _rsum, int _tsum, int _len): sum(_sum), lsum(_lsum), rsum(_rsum), tsum(_tsum), len(_len) {}};inline Data operator+(const Data& lhs, const Data& rhs) {const int _sum = lhs.sum + rhs.sum;const int _lsum = lhs.lsum + (lhs.sum == lhs.len) * rhs.lsum;const int _rsum = rhs.rsum + (rhs.sum == rhs.len) * lhs.rsum;const int _tsum = std::max({lhs.tsum, rhs.tsum, lhs.rsum + rhs.lsum});const int _len = lhs.len + rhs.len;return Data(_sum, _lsum, _rsum, _tsum, _len);}struct Node {int l, r;array<Data, 2> dat;int cov, rev;inline Data& operator[](int i) { return dat[i]; }inline Data operator[](int i) const { return dat[i]; }};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(const vector<int>& a) {const int n = a.size();tr.resize(n << 1);build(0, 0, n - 1, a);}inline void pushup(int u, int mid) {for (int i = 0; i < 2; i++) tr[u][i] = tr[ls(mid)][i] + tr[rs(mid)][i];}inline void apply(int u, int cov, int rev) {if (~cov) {const int len = tr[u][cov].len;tr[u][cov] = Data(len, len, len, len, len);tr[u][cov ^ 1] = Data(0, 0, 0, 0, len);tr[u].cov = cov;tr[u].rev = 0;return;}if (rev) {swap(tr[u][0], tr[u][1]);if (~tr[u].cov) tr[u].cov ^= 1;else tr[u].rev ^= 1;}}inline void pushdown(int u, int mid) {apply(ls(mid), tr[u].cov, tr[u].rev);apply(rs(mid), tr[u].cov, tr[u].rev);tr[u].cov = -1, tr[u].rev = 0;}void build(int u, int l, int r, const vector<int>& a) {tr[u].l = l, tr[u].r = r, tr[u].cov = -1;if (l == r) {for (int i = 0; i < 2; i++) tr[u][i] = Data(a[l] == i);return;}const int mid = (l + r) >> 1;build(ls(mid), l, mid, a);build(rs(mid), mid + 1, r, a);pushup(u, mid);}void update(int u, int l, int r, int cov, int rev) {if (l <= tr[u].l && tr[u].r <= r) return apply(u, cov, rev);const int mid = (tr[u].l + tr[u].r) >> 1;pushdown(u, mid);if (l <= mid) update(ls(mid), l, r, cov, rev);if (r > mid) update(rs(mid), l, r, cov, rev);pushup(u, mid);}Data query(int u, int l, int r) {if (l <= tr[u].l && tr[u].r <= r) return tr[u][1];const int mid = (tr[u].l + tr[u].r) >> 1;pushdown(u, mid);if (r <= mid) return query(ls(mid), l, r);else if (l > mid) return query(rs(mid), l, r);else return query(ls(mid), l, r) + query(rs(mid), l, r);}inline void range_cover(int l, int r, int v) { update(0, l, r, v, 0); }inline void range_negate(int l, int r) { update(0, l, r, -1, 1); }inline int range_sum(int l, int r) { return query(0, l, r).sum; }inline int range_gss(int l, int r) { return query(0, l, r).tsum; }};
}
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<int> a(n);for (int i = 0; i < n; i++) scanf("%d", &a[i]);SegTree sgt(a);for (int i = 0, op, l, r; i < m; i++) {scanf("%d %d %d", &op, &l, &r);if (op == 0) sgt.range_cover(l, r, 0);if (op == 1) sgt.range_cover(l, r, 1);if (op == 2) sgt.range_negate(l, r);if (op == 3) printf("%d\n", sgt.range_sum(l, r));if (op == 4) printf("%d\n", sgt.range_gss(l, r));}return 0;
}

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

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

相关文章

RAG 2.0 深入解读

作者&#xff1a;阿里云开发者 原文&#xff1a;https://zhuanlan.zhihu.com/p/1903437079603545114​ 一、Introduction 过去一年可谓是RAG元年&#xff0c;检索增强生成技术迅速发展与深刻变革&#xff0c;其创新与应用已深刻重塑了大模型落地的技术范式。站在2025年&#x…

代码随想录第41天:图论2(岛屿系列)

一、岛屿数量&#xff08;Kamacoder 99&#xff09; 深度优先搜索&#xff1a; # 定义四个方向&#xff1a;右、下、左、上&#xff0c;用于 DFS 中四向遍历 direction [[0, 1], [1, 0], [0, -1], [-1, 0]]def dfs(grid, visited, x, y):"""对一块陆地进行深度…

基于CNN的猫狗图像分类系统

一、系统概述 本系统是基于PyTorch框架构建的智能图像分类系统&#xff0c;专门针对CIFAR-10数据集中的猫&#xff08;类别3&#xff09;和狗&#xff08;类别5&#xff09;进行分类任务。系统采用卷积神经网络&#xff08;CNN&#xff09;作为核心算法&#xff0c;结合图形用…

linux搭建hadoop学习

linux搭建hadoop学习 下载安装包: 海外资源可能需要翻墙或者找国内资源 cd /opt wget https://dlcdn.apache.org/hadoop/common/hadoop-2.10.2/hadoop-2.10.2.tar.gz tar -zxvf hadoop-2.10.2.tar.gz mv hadoop-2.10.2 hadoop配置环境变量 # 在/etc/profile文件中添加下面内…

Kubernetes生产实战(十六):集群安全加固全攻略

Kubernetes集群安全加固全攻略&#xff1a;生产环境必备的12个关键策略 在容器化时代&#xff0c;Kubernetes已成为企业应用部署的核心基础设施。但根据CNCF 2023年云原生安全报告显示&#xff0c;75%的安全事件源于K8s配置错误。本文将基于生产环境实践&#xff0c;系统讲解集…

类加载机制详解:双亲委派模型与打破它的方式

在复杂的 Java 系统中&#xff0c;类加载是最基础却常被忽略的一环。理解 JVM 的类加载机制&#xff0c;特别是 双亲委派模型&#xff08;Parent Delegation Model&#xff09;&#xff0c;是我们深入掌握热部署、插件机制、ClassLoader 隔离、ClassNotFound 错误等问题的关键。…

Android SDK 开发中的 AAR 与 JAR 区别详解

在 Android SDK 开发中&#xff0c;构建项目时我们常常会看到生成两个不同的文件&#xff1a;一个是 build/outputs/aar/*.aar&#xff0c;另一个是 build/intermediates/aar_main_jar/debug/syncDebugLibJars/classes.jar。很多初学者会疑惑&#xff1a;它们之间有什么区别&am…

服务器配置错误导致SSL/TLS出现安全漏洞,如何进行排查?

SSL/TLS 安全漏洞排查与修复指南 一、常见配置错误类型‌ 弱加密算法与密钥问题‌ 使用弱密码套件&#xff08;如DES、RC4&#xff09;或密钥长度不足&#xff08;如RSA密钥长度<2048位&#xff09;&#xff0c;导致加密强度不足。 密钥管理不当&#xff08;如私钥未加密存…

Day20打卡-奇异值SVD分解

今天学习非特征筛选的方法&#xff1a; 知识点回顾&#xff1a; 线性代数概念回顾&#xff08;可不掌握&#xff09;奇异值推导&#xff08;可不掌握&#xff09;奇异值的应用 特征降维&#xff1a;对高维数据减小计算量、可视化数据重构&#xff1a;比如重构信号、重构图像&am…

temu采购自养号全流程解析:从账号搭建到安全下单的技术闭环

temu 自养号采购下单技术是一个精细的过程&#xff0c;需要从多个方面进行考虑和操作&#xff0c;其核心在于通过技术手段模拟真实用户行为&#xff0c;构建独立、安全的账号环境以确保账号的安全性、真实性和采购下单的成功率。以下是对该技术的详细解析 1. 账号准备 手机号…

相机Camera日志分析之八:高通Camx HAL架构opencamera三级日志详解及关键字

【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:相机Camera日志分析之七:高通Camx HAL架构opencamera二级日志详解及关键字 这一篇我们开始讲: 相机Camera日志分析之八:高通Camx HAL架构opencamera三级日志详解及关键字 目录 【关注我,后续持续…

自定义类型-结构体(二)

结构体内存对齐 偏移量 指的是结构体中某个成员相对于结构体起始地址的字节距离 第一个成员的起始位置为0&#xff0c;一个字节表示一个单位 这里的数字表示的是该成员地址与结构体首地址之间的值 对齐规则 1.结构体第一个成员的第一个字节的偏移量为0 2.其余成员变量要…

【免费工具】图吧工具箱2025.02正式版

DIY爱好者的必备工具 软件截图&#xff1a; —————【下 载 地 址】——————— 【本章单下载】&#xff1a;https://drive.uc.cn/s/f08aad37ddb14 【百款黑科技】&#xff1a;https://ucnygalh6wle.feishu.cn/wiki/HPQywvPc7iLZu1k0ODFcWMt2n0d?fromfrom_copylink …

DAX 权威指南1:DAX计算、表函数与计算上下文

参考《DAX 权威指南 第二版》 文章目录 二、DAX简介2.1 理解 DAX 计算2.2 计算列和度量值2.3 变量2.3.1 VAR简介2.3.2 VAR的特性 2.4 DAX 错误处理2.4.1 DAX 错误类型2.4.1.1 转换错误2.4.1.2 算术运算错误2.4.1.3 空值或 缺失值 2.4.2 使用IFERROR函数拦截错误2.4.2.1 安全地进…

【Linux系统】从零开始构建简易 Shell:从输入处理到命令执行的深度剖析

文章目录 前言一、打印命令行提示符代码功能概述 二、读取键盘输入的指令2.1 为什么不继续使用scanf()而换成了fgets()&#xff1f;2.2 调试输出的意义2.3 为什么需要去掉换行符&#xff1f; 三、指令切割补充知识&#xff1a; strtok 的函数原型 四、普通命令的执行代码功能概…

湖仓一体架构在金融典型数据分析场景中的实践

在数字经济与金融科技深度融合的今天&#xff0c;数据已成为金融机构的核心战略资产。然而&#xff0c;传统数据架构面临着三大困局&#xff0c;制约着金融机构数据价值的充分释放。 一、需求驱动更多银行数据分析场景 金融机构&#xff0c;特别是银行业&#xff0c;面临着双重…

基于Llama3的开发应用(一):Llama模型的简单部署

Llama模型的简单部署 0 前言1 环境准备1.1 硬件环境1.2 软件环境 2 Meta-Llama-3-8B-Instruct 模型简介2.1 Instruct含义2.2 模型下载 3 简单调用4 FastAPI 部署4.1 通过FastAPI简单部署4.2 测试 5 使用 streamlit 构建简易聊天界面6 总结 0 前言 本系列文章是基于Meta-Llama-…

模拟太阳系(C#编写的maui跨平台项目源码)

源码下载地址&#xff1a;https://download.csdn.net/download/wgxds/90789056 本资源为用C#编写的maui跨平台项目源码&#xff0c;使用Visual Studio 2022开发环境&#xff0c;基于.net8.0框架&#xff0c;生成的程序为“模拟太阳系运行”。经测试&#xff0c;生成的程序可运行…

基于人工智能的个性化 MySQL 学习路径推荐研究

基于人工智能的个性化 MySQL 学习路径推荐研究 摘要: 随着信息技术的飞速发展,数据库在各行业应用广泛,MySQL 作为主流数据库之一,学习需求庞大。然而,不同学习者在知识水平、学习进度和目标上存在差异,传统统一的学习路径难以满足个性化需求。本研究通过运用人工智能技…

OSPF综合应用

​ 要求&#xff1a; 1&#xff0c;R5为ISP&#xff0c;其上只能配置IP地址&#xff1b;R4作为企业边界路由器&#xff0c; 出口公网地址需要通过PPP协议获取&#xff0c;并进行chap认证 2&#xff0c;整个OSPF环境IP基于172.16.0.0/16划分&#xff1b; 3&#xff0c;所有设备…