1 条题解
-
0
题意分析
我们有 个巧克力,每个巧克力是二维平面上的点 ,带权值 。
有 个询问,每个询问给出 ,要求计算所有满足 [ a x + b y < c ] 的巧克力的 值之和。
核心难点
- ,需要高效查询。
- 范围很大(),且可为负数。
- 查询是半平面形式 ,但 符号不确定,所以方向任意。
解法思路
1. 暴力法
对每个询问,遍历所有巧克力,检查条件并累加 。
复杂度 ,不可行。
2. 半平面查询问题
查询 等价于点在直线 的某一侧。
由于 可正可负,这个半平面可能是任意方向的。
对于这种任意方向半平面点权和查询,常用方法有:
- K-D Tree 配合剪枝
- 半平面扫描(但这里 很大,难做)
K-D Tree 解法
K-D Tree 可以在 平均时间内完成矩形区域查询,但这里是半平面查询,需要特殊处理。
关键观察
我们可以将 看作线性函数 的值小于 。
在 K-D Tree 查询时,对每个节点维护其包围盒(),并计算 在包围盒上的最小值和最大值。
剪枝策略
对于当前节点:
- 如果包围盒的 ,则整个节点内的点都满足条件,直接返回该子树权值和。
- 如果包围盒的 ,则整个节点内的点都不满足条件,直接返回 。
- 否则递归查询左右子树。
复杂度
- 建树:
- 单次查询:最坏 ,但随机数据下约 ,且剪枝有效。
- 总复杂度:,在 时勉强可过(约 操作)。
算法步骤
- 读入 和巧克力数据 。
- 构建 K-D Tree(按 交替划分),每个节点维护:
- 包围盒
- 子树 和
- 对每个查询 :
- 在 K-D Tree 上做 DFS,用上述剪枝。
- 对叶子节点直接检查 。
- 输出每个查询的结果。
样例验证
输入:
3 3 1 2 5 3 1 4 2 2 1 2 1 6 1 3 5 1 3 7巧克力:
查询 1:
条件 :- : ✓
- : ✗
- : ✗
和 = 5,输出 5。
查询 2:
条件 :- : ✗
- : ✗
- : ✗
和 = 0,输出 0。
查询 3:
条件 :- : ✗
- : ✓
- : ✗
和 = 4,输出 4。
与样例输出一致。
优化技巧
- 轮换划分:K-D Tree 按 和 轮换划分,保持平衡。
- 启发式选择划分点:选中位数作为划分点,使树平衡。
- 提前计算极值:对每个节点预计算 的最小最大值(在查询时根据 计算,因为 每次不同)。
- 对包围盒 ,(注意 符号)
- 同理
总结
这道题通过 K-D Tree 的包围盒极值剪枝,将半平面查询转化为区域查询,利用 的平均复杂度处理大规模数据,是 K-D Tree 在半平面查询中的典型应用。
- 1
信息
- ID
- 4022
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者