1 条题解
-
0
题意理解
我们有 个学生,每个学生有两个分数:数学 ,信息学 。
T 教授标准:
数学 且 信息学 。
I 教授标准:
数学 + 信息学 。
通过条件:同时满足 T 教授和 I 教授的标准。
对于 个询问 ,即 ,求满足条件的学生人数。
问题形式化
对于每个询问 ,我们要数出满足以下条件的学生 的个数:
$$\begin{cases} S_i \ge A \\ T_i \ge B \\ S_i + T_i \ge C \end{cases} $$
直接暴力解法
最直接的方法:对每个询问,遍历所有学生检查条件。 时间复杂度:,在 时不可行。
优化思路
我们需要预处理学生数据,以便快速回答每个查询。
1. 三维条件分析
条件:
可以看作三维空间 中的点,查询是一个三维矩形(实际是半空间)的计数问题。
2. 离线处理 + 排序 + 数据结构
一个常见技巧:将 和 离散化,因为值域很大但数量不多。
设 。
查询条件等价于:
3. 二维偏序思路
我们可以固定一个维度,用离线方法处理。
例如: 将学生按 从大到小排序,将查询按 从大到小排序。 这样,当我们处理一个查询 时,所有 的学生已经加入某个数据结构,我们只需要在这个集合中数出满足 且 的学生个数。
4. 进一步转化
对于 且 的计数,可以看作二维平面 上的矩形查询()。
这是一个典型的二维偏序计数问题,可以用 二维树状数组(Fenwick Tree) 或 线段树套线段树 解决。
5. 具体步骤
离散化 和 (因为 值域是 ,但不同值最多 个)。
将学生按 降序排序。
将查询按 降序排序。
用一个二维树状数组(或线段树)维护 平面上的点。
双指针:
对于当前查询 ,将所有 且尚未加入数据结构的学生加入。
在数据结构中查询 且 的点数。
输出答案。
6. 数据结构查询
我们维护的二维 BIT 是:
第一维是 (离散化后)
第二维是 (离散化后)
加入一个学生 时,在 BIT 的对应位置 。
查询 且 的点数,可以转化为:
更简单:二维 BIT 通常支持矩形和,我们可以直接求 的和。
7. 离散化细节
的离散化:所有 和所有查询的 一起离散化。
的离散化:所有 和所有查询的 一起离散化。
这样保证查询时能找到对应的离散化坐标。
8. 时间复杂度
离散化:
排序:
二维 BIT 操作:每次插入和查询
总复杂度:,可接受。
核心公式
对于查询 ,答案是:
$$\sum_{i=1}^N [S_i \ge A \wedge T_i \ge B \wedge S_i + T_i \ge C] $$其中 是指示函数,条件 成立时为 1,否则为 0。
总结
本题的关键在于:
1.将条件转化为三维空间中的半空间查询。
2.通过离线排序降维。
3.使用二维数据结构维护剩余二维偏序查询。
4.离散化处理大值域。
这样就可以在 时间内解决大规模数据。
- 1
信息
- ID
- 4124
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 3
- 已通过
- 1
- 上传者