当前位置: 首页 > news >正文

树状数组 - P2184 贪婪大陆

P2184 贪婪大陆

点击查看原题

P2184 贪婪大陆

题目背景

面对蚂蚁们的疯狂进攻,小 FF 的 Tower defence 宣告失败……人类被蚂蚁们逼到了 Greed Island 上的一个海湾。现在,小 FF 的后方是一望无际的大海,前方是变异了的超级蚂蚁。小 FF 还有大好前程,他可不想命丧于此, 于是他派遣手下最后一批改造 SCV 布置地雷以阻挡蚂蚁们的进攻。

题目描述

小 FF 最后一道防线是一条长度为 \(n\) 的战壕,小 FF 拥有无数多种地雷,而 SCV 每次可以在 \([L, R]\) 区间埋放同一种不同于之前已经埋放的地雷。由于情况已经十万火急,小 FF 在某些时候可能会询问你在 \([L',R']\) 区间内有多少种不同的地雷,他希望你能尽快的给予答复。

输入格式

第一行为两个整数 \(n\)\(m\)\(n\) 表示防线长度,\(m\) 表示 SCV 布雷次数及小 FF 询问的次数总和。

接下来有 \(m\) 行,每行三个整数 \(q,l,r\)

  • \(q=1\),则表示 SCV 在 \([l, r]\) 这段区间布上一种地雷;
  • \(q=2\),则表示小 FF 询问当前 \([l, r]\) 区间总共有多少种地雷。

输出格式

对于小 FF 的每次询问,输出一个答案(单独一行),表示当前区间地雷种数。

输入输出样例 #1

输入 #1

5 4
1 1 3
2 2 5
1 2 4
2 3 5

输出 #1

1
2

说明/提示

数据规模与约定

  • 对于 \(30\%\) 的数据,\(0 \le n\)\(m \le 1000\)
  • 对于 \(100\%\) 的数据,\(0 \le n\)\(m \le 10^5\)

暴力

遇到这类可能是线段树或者树状数组的题目,可以先写一发暴力找找思路

map<int, set>

这道题目我的第一反应是开一个map<int, set<int>>来维护每个点存了多少雷。但是根据deepseek这样会把区间问题退化成点上的集合问题,丢弃了区间的结构信息。因此该暴力方案不可行。

vector<pair<int, int>>

存储

这个时候,我们观察这个map<int, set<int>>,发现同一种地雷的信息被重复存储了\(r-l+1\)次,信息冗余。事实上,只要存储区间的端点就可以保证记录这一次摆放的地雷的信息。又因为保证每一次在区间上放的地雷种类与之前的不同,因此,我们可以维护一个长度不超过m的数组vector<pair<int, int>> a来存储每一次摆放的地雷信息。

查询

存储很显然是\(O(1)\)的,查询的时候

int cnt = 0;
for (auto[ql, qr] : a)if (ql <= r && qr >= ql) ++ cnt;
cout << cnt << '\n';

这样是固定\(O(m)\)的查询

树状数组

看到这里,区间修改+单点查询的优化,非常自然地想到树状数组。

点击查看完整代码
#include <bits/stdc++.h>
using namespace std;template<typename T>
struct BIT
{int n; vector<T> tr;BIT(int n_){n = n_;tr.assign(n + 1, 0);}void add(int i, T delta){while (i <= n){tr[i] += delta;i += i & -i;}}int sum(int i){int s = 0;while (i > 0){s += tr[i];i -= i & -i;}return s;}
};int main()
{ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);int n, m; cin >> n >> m;BIT<int> bitL(n), bitR(n);while (m -- ){int op, l, r;cin >> op >> l >> r;if (op == 1){bitL.add(l, 1);bitR.add(r, 1);}else{int ans = bitL.sum(r) - bitR.sum(l - 1);cout << ans << '\n';}}return 0;
}
由于树状数组无法维护`PII`,因此把`vector`拆成两个数组 而这里又运用了容斥原理做了一个转换。具体解释如下:(deepseek生成)

先统计所有满足 \(l_i ≤ R\) 的区间数(即 bitL.sum(R)),再减去其中那些不满足 \(r_i ≥ L\) 的区间数(即 \(r_i < L\) 的区间数)。
\(r_i < L\) 等价于 \(r_i ≤ L-1\),数量正好是 \(bitR.sum(L-1)\)
所以 \(bitL.sum(R) - bitR.sum(L-1)\) 统计的就是同时满足 \(l_i ≤ R\)\(r_i ≥ L\) 的区间数。

因此,两种方法在数学上完全等价。树状数组只是用两个前缀和快速算出 \(\lvert U\rvert\)\(\lvert B \rvert\),避免了遍历所有区间。

http://www.jsqmd.com/news/854203/

相关文章:

  • 收藏干货:MySQL/PG/人大金仓/达梦语法差异对照表
  • 你正在找靠谱企业用车平台?这几个维度比榜单靠谱 - 资讯速览
  • 为ubuntu20.04上的claude code配置taotoken作为稳定后端
  • 使用curl命令直接测试Taotoken聊天接口的完整步骤
  • 运动康复证书去哪家机构报名好?2026正规报考培训机构推荐:中山优才教育 - 优选机构推荐
  • 2026 年长沙市汽车贴膜施工工艺行业白皮书 - 资讯速览
  • 连锁vs本土vs小众:丽江婚礼机构怎么选才对 - 资讯速览
  • 每日算法快闪赛:15分钟手撕LeetCode,思维速度与工程落地全攻略
  • 十大知识领域裁剪考量因素表
  • 【干货】如何从软件测试转型为AI测试开发?这份面试题指南值得你一看!
  • 2026年中频滚焊机源头厂家:解读行业核心趋势 - 资讯速览
  • 猫抓资源嗅探终极指南:从零配置到高效下载的完整教程
  • 知网维普同时压到10%,2026年5月降AI软件4款实测 - 我要发一区
  • AI Skill 与 Prompt 的区别:从提示词到可装载能力资产
  • 2026海外住宅IP怎么选?最全服务商实测对比
  • 运动康复证书怎么报名怎么考?正规授权机构推荐:中山优才教育 - 优选机构推荐
  • 行业白皮书 GEO 化转 HTML + 结构化,AI 引用率提升 50%
  • CTP 与 Python 期货量化:封装库还是一体化 SDK
  • 从电磁铁到无线输电:手把手复现特斯拉线圈核心实验(含电路图与材料清单)
  • 告别网格发散!用SMS 13.0为ADCIRC模型构建稳定计算网格的保姆级避坑指南
  • 双率合规新赛道!九大论文辅助利器齐聚,okbiye 领衔解锁检测降重全新玩法
  • 初次使用Taotoken完成模型调用从注册到收到响应的全过程记录
  • AntiDupl.NET终极指南:快速清理重复图片,释放硬盘空间
  • 合同纠纷别慌!2026 年 5 月专业靠谱律师精选推荐 - 外贸老黄
  • 2026调理品腌料生产厂家:三大核心趋势解读 - 资讯速览
  • Taotoken的用量看板如何帮助开发者洞察模型调用模式
  • 别再手动移植了!用STM32CubeMX+Keil AC6一键搞定QP状态机(STM32F407ZGT6实测)
  • RK3399嵌入式主板PCM-8239开发实战:从硬件选型到Android系统定制
  • 保姆级教程:用ArcGIS Pro和Excel搞定城市经济联系度分析(附完整数据源)
  • 2026年会议一体机厂家深度测评:如何为你的会议室匹配最佳方案? - 资讯速览