Luogu P14379 【MX-S9-T2】「LAOI-16」摩天大楼 题解

news/2025/11/5 15:57:48/文章来源:https://www.cnblogs.com/Tsuukaku/p/19193931

Link

Broken Prob Description. 形式化题意如下:

维护一个长度为 \(n\) 的序列 \(a\),要求支持单点修改,每次修改后需要对所有区间 \([l, r]\) 计算 \(f(l, r)\) 之和,其中 \(1 \leq l \lt r \leq n\)。定义 \(f(l, r)\) 的计算法则如下:当且仅当存在一个正整数 \(k\) 使得 \(k \in [l, r)\) 使得左半区间 \([l, k]\)\(\rm mex\) 不等于右半区间 \([k + 1, r]\)\(\rm mex\)\(f(l, r) = 1\),否则 \(f(l, r) = 0\),这里的 \(\rm mex\) 的定义域为 \([1, \infty)\)

这个 \(\rm mex\) 的限制比较棘手,套路化的,我们先求出所有 \([l, r]\) 对数 \(\frac{n(n - 1)}{2}\),然后从方案中扣去不产生贡献的 \(f(l, r) = 0\) 的情况。我们从 \(\rm mex\) 的角度入手,注意到其作为最小的缺失的正整数,总会是序列中从 \(1\) 开始的连续整数集合的第一个缺口。也就是说,\(\rm mex\) 每次都是从 \(1\) 开始向上找。注意到我们的目标仅仅是找到两个 \(\rm mex\) 不同的区间,数字 \(1, 2\) 作为两个最小的两个正整数决定了 \(\rm mex\) 的基本行为,只要区间中同时包含 \(1, 2\) 就一定能找到一个分割点使得左右 \(\rm mex\) 不同,无非是一边区间少了一种数或者都少了。

因此,关键的发现为,\(f(l, r) = 0\) 的情况有且仅有两种:

  • 区间中不存在 \(1\)
  • 区间形如 \([x_l = 1, \dots, x_r = 1]\),其中 \([l + 1, r - 1]\)\(2\)

统计答案时,具体地:

  • 记录极长不含 \(1\) 段长度为 \(x\),则有贡献为 \(0\) 的区间 \(\frac{x(x - 1)}{2}\)
  • 记录极长无 \(2\) 段中 \(1\) 的个数为 \(c\),则有贡献为 \(0\) 的区间 \(\frac{c(c - 1)}{2}\)

对于这两种情况各自维护出线段树,对于无 \(1\) 段维护每个区间左侧极长非 \(1\) 段长度、右侧极长非 \(1\) 段长度以及是否区间内都非 \(1\);对于无 \(2\) 段维护每个区间左、右侧的极长非 \(2\) 段中 \(1\) 的个数以及是否区间内都非 \(2\)

修改时跑线段树合并,复杂度是 \(O(q \log n)\) 的。

#include <bits/stdc++.h>using i64 = long long;constexpr int N = 1e6 + 7;int n, q;
int a[N];struct Seg0 {struct node {int zl, zr, l, r, len;i64 ans;} tr[N << 2];#define ls(o) (o << 1)#define rs(o) (o << 1 | 1)i64 calc(int len) {return 1ll * len * (len + 1) / 2;}node merge(node L, node R) {node res;res.len = L.len + R.len;if (L.zl == L.len) {res.zl = L.zl + R.zl;res.l = L.l + R.l;} else {res.zl = L.zl;res.l = L.l;}if (R.zr == R.len) {res.zr = R.zr + L.zr;res.r = R.r + L.r;} else {res.zr = R.zr;res.r = R.r;}res.ans = L.ans + R.ans;res.ans += 1ll * L.r * R.l;return res;}void build(int o, int l, int r) {if (l == r) {if (a[l] == 1) tr[o] = {1, 1, 1, 1, 1, 1};else if (a[l] == 2) tr[o] = {0, 0, 0, 0, 1, 0};else tr[o] = {1, 1, 0, 0, 1, 0};return;}int mid = (l + r) >> 1;build(ls(o), l, mid);build(rs(o), mid + 1, r);tr[o] = merge(tr[ls(o)], tr[rs(o)]);}void update(int o, int l, int r, int p) {if (l == r) {if (a[l] == 1) tr[o] = {1, 1, 1, 1, 1, 1};else if (a[l] == 2) tr[o] = {0, 0, 0, 0, 1, 0};else tr[o] = {1, 1, 0, 0, 1, 0};return;}int mid = (l + r) >> 1;if (p <= mid) update(ls(o), l, mid, p);else update(rs(o), mid + 1, r, p);tr[o] = merge(tr[ls(o)], tr[rs(o)]);}node query(int o, int l, int r, int ql, int qr) {if (ql <= l && r <= qr) return tr[o];int mid = (l + r) >> 1;if (qr <= mid) return query(ls(o), l, mid, ql, qr);if (ql > mid) return query(rs(o), mid + 1, r, ql, qr);return merge(query(ls(o), l, mid, ql, mid), query(rs(o), mid + 1, r, mid + 1, qr));}
} seg0;struct Seg1 {struct node {int l, r, len;i64 ans;} tr[N << 2];#define ls(o) (o << 1)#define rs(o) (o << 1 | 1)node merge(node L, node R) {node res;res.len = L.len + R.len;if (L.l == L.len) res.l = L.l + R.l;else res.l = L.l;if (R.r == R.len) res.r = R.r + L.r;else res.r = R.r;res.ans = L.ans + R.ans;res.ans += 1ll * L.r * R.l;return res;}void build(int o, int l, int r) {if (l == r) {if (a[l] == 1) tr[o] = {0, 0, 1, 0};else tr[o] = {1, 1, 1, 1};return;}int mid = (l + r) >> 1;build(ls(o), l, mid);build(rs(o), mid + 1, r);tr[o] = merge(tr[ls(o)], tr[rs(o)]);}void update(int o, int l, int r, int p) {if (l == r) {if (a[l] == 1) tr[o] = {0, 0, 1, 0};else tr[o] = {1, 1, 1, 1};return;}int mid = (l + r) >> 1;if (p <= mid) update(ls(o), l, mid, p);else update(rs(o), mid + 1, r, p);tr[o] = merge(tr[ls(o)], tr[rs(o)]);}node query(int o, int l, int r, int ql, int qr) {if (ql <= l && r <= qr) return tr[o];int mid = (l + r) >> 1;if (qr <= mid) return query(ls(o), l, mid, ql, qr);if (ql > mid) return query(rs(o), mid + 1, r, ql, qr);return merge(query(ls(o), l, mid, ql, mid), query(rs(o), mid + 1, r, mid + 1, qr));}
} seg1;int main() {std::ios::sync_with_stdio(false);std::cin.tie(nullptr);std::cin >> n >> q;for (int i = 1; i <= n; i++) {std::cin >> a[i];}seg0.build(1, 1, n);seg1.build(1, 1, n);while (q--) {int x, v;std::cin >> x >> v;a[x] = v;seg0.update(1, 1, n, x);seg1.update(1, 1, n, x);i64 ans = 1ll * n * (n + 1) / 2;ans -= seg0.query(1, 1, n, 1, n).ans;ans -= seg1.query(1, 1, n, 1, n).ans;std::cout << ans << "\n";}return 0;
}

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

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

相关文章

251105B. 换来换去/card

251105B. 换来换去/card 计数将 \(n\) 个区分的物品划入任意个大小 \(\ge 2\) 的不区分集合的方案数。 \[n\le 10^7 \] 首先,这个问题看起来很像贝尔数:计数将 \(n\) 个区分的物品划入任意个不区分集合的方案数。这个…

2025年广东商用新风系统品牌推荐,广东中电深度解析

在工业通风与商用空气净化领域,产品的技术可靠性、静音性能与节能效率直接决定企业竞争力。面对市场上良莠不齐的新风设备品牌,如何选择兼具品质与口碑的供应商?以下依据技术实力、用户反馈与市场表现,为你推荐202…

docker加速器1Panel

系统介绍 1Panel-dev是一款现代化、开源的Linux服务器运维管理面板,为用户提供了一个功能全面、用户友好、安全可靠的Linux服务器运维管理解决方案。 安装教程 RedHat/CentOScurl -sSL https://resource.fit2cloud.co…

AI开发实践:如何通过案例学习快速上手项目开发

AI开发实践:如何通过案例学习快速上手项目开发在AI技术快速发展的当下,许多开发者面临着这样的困境:虽然对AI开发充满兴趣,但缺乏实际项目经验,不知从何入手。最近了解到的JBoltAI案例实践服务,或许为这个问题提…

debian 安装redis ubuntu 安装redis

1、命令安装apt install redis 2、常用命令systemctl enable redis-server # 开机自启redis服务 systemctl disable redis-server # 取消开机自启 systemctl start redis-server  # 启动re…

2025 年 11 月温泉泳池设备,酒店泳池设备,别墅泳池设备厂家最新推荐,技术实力与市场口碑深度解析!

引言 随着康体休闲产业的持续升级,温泉泳池、酒店泳池及别墅泳池设备的市场需求呈现爆发式增长,消费者对设备的专业性、稳定性及定制化需求也日益提升。为帮助行业从业者与终端客户精准筛选优质厂家,国际泳池设备协…

2025年布匹堆垛架订做厂家权威推荐榜单:冷库堆垛架/折叠式堆垛架/抽插堆垛架源头厂家精选

随着纺织行业仓储物流升级需求的持续增长,布匹堆垛架作为专业化仓储设备,其定制化市场需求显著上升。布匹堆垛架以其高承载性、空间利用率高和专业化结构设计,广泛应用于面料仓库、纺织车间及物流配送中心等场景。本…

精准调控等离子体的“节奏大师”:探秘正负不对称双极性脉冲电源 - FORCREAT

睿能非衡_系列 正负不对称双极性脉冲电源 PPSfeih在现代制造业与科研领域,从智能手机的金属光泽表面,到切削工具上坚硬的保护涂层,再到芯片内部纳米级的绝缘薄膜——这些看似普通的表面背后,都离不开一项关键工艺:…

CentOS 7 安装条码识别工具 zbar

终端命令 sudo yum install -y epel-release sudo yum --enablerepo=epel install -y zbar which zbarimg && zbarimg --versionphp代码案例 从图片上传过来 到识别一维码 <?php // /shopapi/upload.php …

2025 年 11 月膜结构停车棚,膜结构汽车棚,膜结构推拉棚厂家最新推荐,实力品牌深度解析采购无忧之选!

引言 如今,膜结构停车棚、膜结构汽车棚、膜结构推拉棚在停车配套、商业仓储、民生服务等领域的应用愈发广泛,然而市场上厂家资质、产品质量差异较大,给需求方采购带来困扰。为此,行业权威协会联合第三方测评机构开…

2025深圳艺考生文化课辅导推荐榜:全日制艺考生文化课培训机构,精准提分机构精选

文化课已成为艺考生升学路上的关键支撑,2025 年相关培训需求持续升温。这份榜单聚焦深圳优质机构,为艺术学子筛选专业靠谱的文化课助力伙伴。 一、全日制艺考生文化课提升学习榜单摘要 企业介绍 本次上榜机构均深耕艺…

2025 年专用数控机床厂家最新推荐榜:品牌技术实力解析,附协会测评权威数据立车/数控双头/双头数控机床机床双主轴公司推荐

引言 机床作为制造业的 “母机”,其品质直接决定下游产业的加工精度与生产效率。据中国机床工具工业协会 2025 年三季度测评数据显示,国内机床市场中仅 32% 的企业能满足高端制造对 “高精度、高稳定性、智能化” 的…

2025室外/攀爬/绳网/水上/无动力/公园/景区/酒店/幼教/儿童滑梯/户外/淘气堡/小区/木质/游乐设施实力厂家推荐榜:启乐迪领衔,这些品牌凭品质站稳市场

在文旅消费与休闲产业升级的浪潮下,游乐设施的安全性、创新性与适配性成为市场核心需求。2025 年,一批兼具技术实力与服务能力的游乐设施厂家脱颖而出,以下推荐榜聚焦品质与口碑,为需求方提供参考。 广东启乐迪实业…

2025年方形橡胶减震器工厂权威推荐榜单:JGF型减震器/JGF型橡胶减震器/ZA型橡胶减震器源头厂家精选

随着现代工业对设备稳定性和噪声控制要求的不断提高,方形橡胶减震器作为基础减震元件,其市场需求持续增长。该类产品以其结构紧凑、安装便捷和良好的阻尼特性,在工业设备、建筑工程及轨道交通等领域发挥重要作用。本…

2025 年车床厂家最新推荐榜:聚焦创新实力与市场认可度,精选 优质企业助力企业采购决策双头车床/双头数控车床公司推荐

引言 在制造业转型升级进程中,车床作为核心加工设备,其品质与性能对生产效率影响重大。为给企业采购提供可靠参考,行业协会开展专项测评,从技术创新、产品品质、售后服务、市场口碑四大维度,对近百家车床制造商进…

2025/11/6

2025/11/6学习数据结构,复习二叉树的内容,并实现其算法

豆绿色16进制

豆绿色16进制护眼豆绿色背景RGB 护眼豆绿色RGB值:(199,237,204) 十六进制颜色:#C7EDCC或用#CCE8CF

详细介绍:用一个 Bash CLI 管理多款 AI 开发工具:jt-code-cli 实战与原理解析

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

【中南大学主办|高录用快见刊】第七届建筑学研究前沿与生态环境国际研讨会(ARFEE 2025)

第七届建筑学研究前沿与生态环境国际研讨会(ARFEE 2025)将于2025年11月21-23日在湖南长沙召开。会议主要围绕“建筑学研究前沿与生态环境”的最新研究展开。本次会议旨在为研究领域为建筑与生态环境的、来自国内外高…

Redis 基础入门与核心概念【第一部分】

前面将多线程、锁、线程安全部分内容完整了解了一遍,接下来准备点啥呢?发现最开始Redis部分的内容写的有些凌乱,想着趁着这次机会把Redis部分从头到尾梳理一遍,如果想了解或者梳理Redis知识的小伙伴,看这个系列的…