hdu-6951 Rocket land 2021杭电多校第一场1002 求圆形区域权值和(分块切割法)

博客介绍了如何使用分块切割法解决一个平面上的几何问题,即求解n个点中以每个点为圆心,特定半径内的点的权值和。通过将平面分成m*m的块,枚举每个点并确定圆的轮廓所在块,再利用树状数组维护区间和来处理内部块,实现了O(m)的时间复杂度,解决了n<=1e5且坐标与半径范围不超过1e9的数据规模问题。代码实现表明这种方法的效率接近于kd-tree解法。
摘要由CSDN通过智能技术生成

原题链接

题意:平面上n个点,对每个点i求[1,i]中以(xi,yi)为圆心,ri为半径的所有点的权值和,保证数据随机。n<=1e5 |xi|,|yi|,vi,ri<=1e9

考虑分块,令m\sqrt{n},将平面分割成m*m块。从前往后枚举每个点,对每个点都找出圆的轮廓所在的块(根据轮廓与块的边界的交点判断)。

1,对于轮廓所在的块,直接暴力枚举其中的点,答案加上满足距离小于等于半径的点的权值。可以发现,轮廓所在块的个数为O(m),而n个点会均匀散落在m*m个块内,所以每个块内的期望元素个数为O(1),所以这个部分的复杂度是O(m)。

2,对于在轮廓内部的块,要对每一行(或者列)求一次块的区间和。可以用树状数组维护区间和,这样的话复杂度为O(m*log(m))。考虑到每个点会有O(m)次查询,而只有1次修改,所以修改就直接O(m)地修改前缀和,查询就是前缀和做差,O(1)完成。这样修改和查询的复杂度都是O(m),所以这个部分的总复杂度也是O(m)。

最后复杂度就是

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值