尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

QOJ #967. Rectangle Painting 题解

QOJ #967. Rectangle Painting 题解
📅 发布时间:2026/6/20 1:29:38

Description

小 N 不会写代码,所以他只会简单数据结构,于是他找到了一个基础线段树练习题。

在数轴上,每个自然数点都有一个可重集 \(A_0, A_1, A_2, \ldots\),初始时均为空。

你要支持以下操作 \(q\) 次:

  • \(x, a, b\):对 \(\forall a \le i \le b\),在 \(A_i\) 中插入元素 \(x\)。
  • \(l, r\):求 \(\displaystyle \max_{l \le i \le r} \operatorname{mex} A_i\)。

由于这太简单了,所以这个题强制在线。

\(1\leq q\leq 10^5,0\leq a,b,l,r,x\leq 2\times 10^5\)。

Solution

首先考虑不强制在线怎么做。

对于单个集合,注意到向它里面插入元素 \(x\) 是不好维护 \(\text{mex}\) 的,但是如果是删除元素 \(x\),就可以直接让 \(\text{mex}\leftarrow\min(\text{mex},x)\)。

所以离线时可以先把所有集合最终的 \(\text{mex}\) 求出来,再倒着删除插入操作,并进行区间 \(\text{chkmin}\) 即可。


回到这道题。

考虑对于每个 \(x\),用线段树计算它对哪些集合造成贡献。

然后维护集合 \(B_i\) 表示所有 \(A_i\) 中没有出现过的元素,初始 \(B_i=\mathbb{N}^*\),那么问题变为:

  • 区间删除一个元素 \(x\)。
  • 查询 \(\displaystyle \max_{l \le i \le r} \operatorname{mex} B_i\)。

再用 set 维护所有极长区间,满足 \(x\) 在这些区间的 \(B_i\) 中出现了,那么 \(x\) 就只能对这个 set 里的区间造成贡献。容易用颜色段均摊做。

计算区间贡献时就在每个线段树节点上维护个 set 即可。

时间复杂度:\(O(n\log n+q\log^2n)\)。

Code

#include <bits/stdc++.h>// #define int int64_tusing i64 = int64_t;const int kMaxN = 2e5 + 5;int n = 2e5, q;
std::set<std::pair<int, int>> seg[kMaxN];struct SGT {int val[kMaxN * 4];std::set<int> st[kMaxN * 4];void pushup(int x) {val[x] = std::min(!st[x].size() ? n : *st[x].begin(), std::max(val[x << 1], val[x << 1 | 1]));}void build(int x, int l, int r) {val[x] = n;if (l == r) return;int mid = (l + r) >> 1;build(x << 1, l, mid), build(x << 1 | 1, mid + 1, r);}void update(int x, int l, int r, int ql, int qr, int v, bool op = 1) {if (l > qr || r < ql) {return;} else if (l >= ql && r <= qr) {if (op) st[x].emplace(v);else st[x].erase(v);return l == r ? void(val[x] = (!st[x].size() ? n : *st[x].begin())) : pushup(x);}int mid = (l + r) >> 1;update(x << 1, l, mid, ql, qr, v, op), update(x << 1 | 1, mid + 1, r, ql, qr, v, op);pushup(x);}int query(int x, int l, int r, int ql, int qr) {if (l > qr || r < ql) return 0;else if (l >= ql && r <= qr) return val[x];int mid = (l + r) >> 1;return std::min(!st[x].size() ? n : *st[x].begin(), std::max(query(x << 1, l, mid, ql, qr), query(x << 1 | 1, mid + 1, r, ql, qr)));}
} sgt;void split(int x, int p) {auto it = seg[x].lower_bound({p + 1, 0});if (it == seg[x].begin()) return;--it;auto [l, r] = *it;if (l == p || r < p) return;sgt.update(1, 0, n, l, r, x, 0), sgt.update(1, 0, n, l, p - 1, x, 1), sgt.update(1, 0, n, p, r, x, 1);seg[x].erase(it), seg[x].emplace(l, p - 1), seg[x].emplace(p, r);
}void ins(int l, int r, int v) {split(v, l), split(v, r + 1);for (auto it = seg[v].lower_bound({l, 0}); it != seg[v].end() && it->second <= r; it = seg[v].lower_bound({l, 0})) {sgt.update(1, 0, n, it->first, it->second, v, 0);seg[v].erase(it);}
}int query(int l, int r) { return sgt.query(1, 0, n, l, r); }void dickdreamer() {std::cin >> q;sgt.build(1, 0, n);for (int i = 0; i <= n; ++i) seg[i].emplace(0, n), sgt.update(1, 0, n, 0, n, i, 1);i64 S = 0;for (int i = 1; i <= q; ++i) {int op;i64 v, l, r;std::cin >> op;if (op == 1) {std::cin >> v >> l >> r;v ^= S, l ^= S, r ^= S;ins(l, r, v);} else {std::cin >> l >> r;l ^= S, r ^= S;int res = query(l, r);std::cout << res << '\n';S += res;}}
}int32_t main() {
#ifdef ORZXKRfreopen("in.txt", "r", stdin);freopen("out.txt", "w", stdout);
#endifstd::ios::sync_with_stdio(0), std::cin.tie(0), std::cout.tie(0);int T = 1;// std::cin >> T;while (T--) dickdreamer();// std::cerr << 1.0 * clock() / CLOCKS_PER_SEC << "s\n";return 0;
}

相关新闻

  • L07_2
  • 2025 年最新地磅制造厂家推荐排行榜:聚焦品质创新服务,助力企业精准选优质地磅汽车衡 / 大型 / 可移动 / 100 吨 / SCS 型 / 自动称重地磅推荐
  • layui多文件上传表格

最新新闻

  • 2026年6月,如何精准联系并选择知名的西安拓展夏令营? - 品牌鉴赏官2026
  • SQLi-Labs靶场从零搭建到通关全攻略(一):环境搭建与基础四关
  • AI搜索时代,深圳企业如何用“全意图GEO”抢占7亿用户的第一推荐位? - GEO优化
  • Page Assist终极指南:让本地AI模型成为你的网页浏览智能伴侣
  • 2026滨州漏水检测维修精选优质服务商TOP5推荐!卫生间漏水/厨房漏水/屋顶天花板漏水/阳台漏水/地下室漏水防水补漏检测维修-正规防水补漏公司优选口碑榜测评推荐 - 即刻修防水
  • Windows系统文件msvcp100d.dll丢失找不到问题解决

日新闻

  • 信任的进化:技术实现详解——如何用JavaScript构建博弈论模拟器
  • Terrakube自定义工作流:如何集成OPA、Infracost等工具扩展IaC能力
  • grunt-concurrent快速入门:5分钟学会并行运行Grunt任务

周新闻

  • 3步解锁iOS设备:applera1n激活锁绕过完全指南
  • 39 2026 人工智能证书终极盘点,普通人选 AI 证书可以从这些方向入手
  • Redis 暴露公网有多危险?从端口检查到补救步骤

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号