1. 问题分析与建模
1.1 题目理解与关键点提取
这道题目要求我们找到一个水平分割线y=k,使得所有正方形在该线上方的总面积等于线下方的总面积。题目给出了几个关键约束条件:
- 正方形都是与x轴平行的,由左下角坐标(xi,yi)和边长li确定
- 正方形之间可能存在重叠区域,重叠部分需要重复计算
- 答案精度要求误差不超过10^-5
- 输入规模可能达到5×10^4个正方形
从示例分析可以看出,当分割线穿过正方形时,需要精确计算被分割的面积。例如在示例2中,红色正方形(边长2)被y=1.16667分割,线上部分占5/6,线下部分占7/6。
1.2 数学建模与性质分析
设总面积为Stotal,我们需要找到最小的y=k使得线下面积Sbelow(k)=Stotal/2。通过分析可以发现:
- Sbelow(k)是关于k的非递减函数:当k增大时,线下面积不会减少
- Sbelow(k)是连续函数:当k变化时,线下面积不会突变
- 当k=0时Sbelow(0)=0,当k=max(yi+li)时Sbelow=Stotal
这些性质表明我们可以使用二分查找来高效地找到满足条件的k值,因为函数具有单调性且连续,保证了二分查找的正确性。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 算法设计与优化
2.1 二分查找框架设计
基于上述分析,我们采用二分查找算法框架:
- 确定搜索范围:left=0,right=max(yi+li)
- 计算总面积Stotal
- 进行二分迭代:
- mid = (left + right)/2
- 计算Sbelow(mid)
- 比较Sbelow(mid)与Stotal/2
- 调整左右边界
- 当区间足够小时返回结果
注意:由于题目要求精度为10^-5,我们需要确保二分查找的迭代次数足够。47次迭代可以保证区间长度小于2^-47≈7×10^-15,远高于精度要求。
2.2 面积计算优化
计算Sbelow(k)时需要遍历所有正方形,对每个正方形计算其在线下的面积贡献:
- 若k ≤ yi:贡献为0
- 若k ≥ yi+li:贡献为li²
- 若yi < k < yi+li:贡献为li×(k-yi)
这个计算过程时间复杂度为O(n),是算法的主要耗时部分。由于
