题解:Luogu P14175 【MX-X23-T5】向死存魏

news/2025/10/20 22:09:17/文章来源:https://www.cnblogs.com/P2441M/p/19153792

题意

给定长度为 \(n\) 的序列 \(a\) 和值域 \(V\)。有 \(m\) 次操作:

  1. 给定 \(l,r,x\),将 \(a[l,r]\)\(=x\) 的数改为 \(0\)
  2. 给定 \(x\),在序列末尾添加 \(x\)
  3. 给定 \(l\),查询最小的 \(r\) 使得 \(a[l,r]\) 中包含了 \([1,V]\) 中的所有数,或报告无解。

\(1\leq n,m,V\leq 5\times 10^5\)\(1\leq x,a_i\leq V\)

题解

不是很难的题,击杀了。

下面视 \(n,m,V\) 同阶。

考虑对于每个值 \(x\),把序列中所有 \(=x\) 的下标取出来,记作 \(p_1,p_2,\cdots,p_k\),特别地,令 \(p_0=0\)。考察每个 \(1\leq i\leq k\),我们把 \([p_{i-1}+1,p_i]\) 视作一个权值为 \(p_i\) 的线段。显然每个点最多只会被一个值对应的线段覆盖一次,因此对于每次查询,我们首先判断这个点是否被覆盖了恰好 \(V\) 次,若不是则无解,否则答案就是所有覆盖这个点的线段中权值的最大值。

每个点的覆盖次数容易用 BIT 维护,对于权值的最大值,需要支持区间 \(\operatorname{chkmax}\) 和撤销某次 \(\operatorname{chkmax}\) 的效果,我们开一棵线段树,在每个节点上维护一个 multiset,这样每次 \(\operatorname{chkmax}\) 或撤销在对应节点的 multiset 上增删即可,单点查询就返回根到叶子的路径上的 multiset 的最大值。对于每种值,我们用 set 维护其下标序列,那么操作 \(1,2\) 就对应增删区间即可。显然操作 \(1\) 直接遍历区间内 \(=x\) 的位置均摊下来是 \(\mathcal{O}(n\log{n})\) 的。

这样我们就得到了一个 \(\mathcal{O}(n\log^2{n})\) 的做法。可以获得 \(60\) 分。

考虑优化,瓶颈在于线段树的部分。不难注意到对于每种值,线段的权值是从左到右单调递增的,所以对于每个线段 \([l,r]\),我们直接对 \([l,n]\) 做后缀 \(\operatorname{chkmin}\) 也是对的。而对于撤销,可以发现我们总是删除一段区间里的若干相邻线段 \([l_i,r_i]\),然后插入新线段 \([L,R]\),并且因为这些被删除的线段都被 \([L,R]\) 包含,所以我们直接把新线段的影响覆盖上去,就可以撤销掉被删除线段的影响了。这样只需要使用另一棵 BIT 支持后缀 \(\operatorname{chkmin}\) 和单点查询,时间复杂度就优化到了 \(\mathcal{O}(n\log{n})\)

代码

#include <bits/stdc++.h>using namespace std;#define lowbit(x) ((x) & -(x))
typedef long long ll;
typedef pair<int, int> pii;
const int N = 5e5 + 5;template<typename T> inline void chk_min(T &x, T y) { x = min(x, y); }
template<typename T> inline void chk_max(T &x, T y) { x = max(x, y); }int n, m, v, len, a[N];
set<int> pos[N];struct BIT {int c[N << 1];int query(int x) {int res = 0;for (; x; x -= lowbit(x)) res += c[x];return res;}void add(int x, int v) { for (; x <= n + m; x += lowbit(x)) c[x] += v;}
} ft;
struct BIT2 {int c[N << 1];int query(int x) {int res = 0;for (; x; x -= lowbit(x)) chk_max(res, c[x]);return res;}void upd(int x, int v) { for (; x <= n + m; x += lowbit(x)) chk_max(c[x], v); }
} ft2;int main() {ios::sync_with_stdio(0), cin.tie(0);cin >> n >> m >> v;for (int i = 1; i <= v; ++i) pos[i].insert(0);for (int i = 1; i <= n; ++i) {cin >> a[i];int prv = *prev(pos[a[i]].end());ft.add(prv + 1, 1), ft.add(i + 1, -1), ft2.upd(prv + 1, i);pos[a[i]].insert(i);}len = n;for (int i = 1; i <= m; ++i) {int tp; cin >> tp;if (tp == 1) {int l, r, x; cin >> l >> r >> x;auto it1 = pos[x].lower_bound(l), it2 = pos[x].upper_bound(r);for (auto it = it1; it != it2; ++it) {int L = (*prev(it)) + 1, R = *it;ft.add(L, -1), ft.add(R + 1, 1);}if (it2 != pos[x].end()) {int L = (*prev(it2)) + 1, R = *it2;ft.add(L, -1), ft.add(R + 1, 1);}pos[x].erase(it1, it2);it2 = pos[x].upper_bound(r);if (it2 != pos[x].end()) {int L = (*prev(it2)) + 1, R = *it2;ft.add(L, 1), ft.add(R + 1, -1), ft2.upd(L, R);}} else if (tp == 2) {int x; cin >> x;int prv = *prev(pos[x].end()); ++len;ft.add(prv + 1, 1), ft.add(len + 1, -1), ft2.upd(prv + 1, len); pos[x].insert(len);} else {int l, ans; cin >> l;if (ft.query(l) < v) ans = -1;else ans = ft2.query(l);cout << ans << endl;}}return 0;
}

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

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

相关文章

软工第三次作业————结对作业

软工第三次作业————结对作业软工第三次作业--结对作业 软工第三次作业结对作业——实现一个自动生成小学四则运算题目的命令行程序(也可以用图像界面,具有相似功能)项目作业 实现一个自动生成小学四则运算题目的…

Spring 常见注解

目录🧐 @Configuration 和 @Import 的核心区别详细解释1. @Configuration (配置类)2. @Import (引入)参考资料 🧐 @Configuration 和 @Import 的核心区别特性 @Configuration @Import主要目的 标记一个类是 Java 配…

题解:AtCoder ARC208C Mod of XOR

题意 给定 \(C,X\),构造一个 \(n(1\leq n<2^{60})\) 使得 \((n\oplus C)\bmod{n}=X\),或报告无解。多测,\(1\leq T\leq 2\times 10^5\),\(1\leq C,X<2^{30}\)。 题解 神人构造题。 显然要有 \(n>X\)。不妨…

题解:Luogu P6898 [ICPC 2014 WF] Metal Processing Plant

题意 给定 \(n\),对于每个 \(1\leq i,j\leq n\),给出 \(d(i,j)\)。对于集合 \(S\),定义 \(D(S)=\max\limits_{i,j\in S}d(i,j)\)。将 \(\{1,2,\cdots,n\}\) 划分为两个集合 \(A,B\),最小化 \(D(A)+D(B)\)。\(1\leq…

32-腾讯IM接入资料和定价

腾讯IM接入资料和定价信息 一、产品概述 腾讯云即时通信IM(Instant Messaging)是腾讯提供的企业级即时通讯服务,支持多种平台接入,包括Android、iOS、Web和小程序等。 二、定价信息 1. 基础服务资费体验版: 提供完…

题解:AtCoder ARC207A Affinity for Artifacts

题意 给定长度为 \(n\) 的序列 \(a\) 和一个数 \(X\),求有多少种 \(a\) 的重排 \(b\) 使得 \(\sum\limits_{i=1}^n\max(b_i-i+1,0)\leq X\)。\(1\leq n\leq 100\),\(1\leq a_i,X\leq 10^9\)。 题解 你说得对,但我怎…

题解:Luogu P9260 [PA 2022] Miny

题意 给定一棵 \(n\) 个点的树,第 \(i\) 条边 \((a_i,b_i)\) 有边权 \(c_i\),第 \(i\) 个点有一个爆炸半径 \(r_i\)。当一个点被引爆时,所有在该点爆炸半径范围内的点也会被引爆,这些新的被引爆的点也可能继续引爆…

题解:Luogu P13544 [OOI 2022] Serious Business

题意 给定一个 \(3\times n\) 的网格,每个格子 \((i,j)\) 内有一个数 \(a_{i,j}\)。一个人初始分数为 \(0\),在位置 \((1,1)\) 处,每次可以向右或向下走一格,目标是到达 \((3,n)\)。当走到格子 \((i,j)\) 时,这个…

题解:Luogu P14254 分割(divide)

题意 给定一棵 \(n\) 个点的树,设根节点 \(1\) 的深度为 \(1\)。给定 \(k\),求有多少从树中选出 \(k\) 个两两不同的节点,组成有序序列 \(b_1,\cdots,b_k\) 的方案,使得:对于每个 \(1\leq i<k\),\(1<d_{b_…

31_创蓝短信接入资料和定价

创蓝短信接入资料和定价 公司简介 创蓝云智为企业提供短信、语音外呼、闪验、号码检测、实名认证等通讯类产品,致力于让企业更高效高质量的获得用户及触达用户。 产品类型通知短信 会员营销短信 国际营销短信 验证码短…

构造单

题目来源 取模下序列构造 是否存在 \(3\) 个长度为 \(n\) 的 \([0,n)\) 的排列 \(a,b,c\),使得 \(a_i+b_i=c_i\mod n\) 遇到取模考虑奇偶性,不要像太复杂,考虑 \(n\) 为奇数的时候直接 \(a=b=~0,1,2,3,4,…\),\(c=…

02.Python百行代码实现抽奖系统

02.Python百行代码实现抽奖系统 ------------------------------------------------ 执行后——————————————————————————————————————————————————————————…

[笔记]高斯消元

高斯消元法是求解线性方程组的经典算法。 内容 求解如下的线性方程组(P3389 【模板】高斯消元法): \[\begin{cases} a_{1,1}x_1+a_{1,2}x_2+\dots+a_{1,n}x_n=b_1\\ a_{2,1}x_1+a_{2,2}x_2+\dots+a_{2,n}x_n=b_2\\ …

[SSH] scp:基于 SSH 的安全文件传输

[SSH] scp:基于 SSH 的安全文件传输$(".postTitle2").removeClass("postTitle2").addClass("singleposttitle");目录01 简介02 操作2.1 本地发送到远程2.2 从远程下载2.3 主机之间复制…

CSP-S 35

10.2010.20 神秘%你赛,rk1 170 ,你管这叫CSP-S? t1 赛时狂写t1 ,想了半天想出来个神秘做法,时间复杂度不会证但应该是对的,写完本地大阳历1.2s 感觉应该没啥大问题,结果空间炸了,最后2h写的代码和暴力分一样多 …

题解:P11662 [JOI 2025 Final] 方格染色 / Grid Coloring

题目传送门 是一道黄题 这里提供一种 \(O(n\log n)\) 的做法\(\mathscr{PART\ \ ONE}\)我们在手%的时候不难发现(注意力有点也不惊人) 虽然第一列和第一行 不保证有序 但是因为这里的前缀$\ max\ $性质保证了第二列和…

CSP-S 32 多校5

10.1510.15 S-32&&多校5 签到后遗憾离场。 t1 签到题,大力分讨即可。 注意符号。 记得排序(没大阳历时忘排序了) code锵锵 #include <bits/stdc++.h> using namespace std; const int N = 1e6 + 10;…

CSP-S 33

10.1710.17 t1 签到题 注意到约数只有 \(O(\sqrt n)\) 级别,暴力找约数即可。 唐人当然有唐做法啦! 分解质因数+dfs搜约数 反正唐就对了。 code嘻嘻 #include <bits/stdc++.h> #define int long long #define…

CSP-S 29

10.11 只记录了当时认为有意义的题10.11 t3 赛后才看懂题面 \(\ldots\) 妈妈我会推式子!(骗你的其实我不会) 推完式子就过了。 考虑先求出 \(1\) 为根时的答案,之后换根即可。 开始拆贡献ing 对于根结点,由于一开…

10.20每日总结

今天主要的课程有软件设计,软件开发案例分析,大数据技术,物联网工程。完成了好几项作业,满课还是太忙太累了,软考网课开始第三章。