BZOJ 2458 BeiJing 2011 最小三角形 分治

博客介绍了如何利用分治策略解决计算几何问题,寻找平面上点集构成的最小周长三角形。首先按x坐标排序,用全局最优解限制分治范围。当点的数量小于一定阈值(如20)时,直接暴力枚举。在分治过程中,确定中轴并保留与之距离不超过最优周长一半的点。此外,还针对左右区间进行了进一步优化,避免了无效的三角形组合。最后提醒在编写分治算法时注意字符区分。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目大意:给出平面上一些点,问这些点组成的最小周长三角形的周长是多少。


思路:与平面最近点对类似的思想,先按照x值排序,通过全局目前搜到的最优解来缩小分治之后需要暴力枚举的范围。具体来说,递归的终止条件是需要处理的点数小于一定数量,就在这些点中暴力枚举来更新答案。这个值经过测定,在这个题中20左右为最快的。具体怎么算我也不知道。。

之后每处理一段区间,先递归处理左右区间来更新答案,弄出一个中轴来,设目前为止最优的答案是c,那么只保留距离中轴距离不超过c / 2的点来处理,不难证明在这之外的点不可能更新答案。
这些点中暴力枚举还是太多了,还需要一个小优化。对于左边的每个点来说,能够与这个点组成三角形的右边的两个点也是有限的。具体来说,y值相差超过c / 2的点是肯定不能与它组成三角形来更新答案的。这个在纸上画一画很显然就能够得到答案。

PS:写分治的时候要分清‘1’和‘l’啊。。


CODE:

#include <cmath>
#include <cstdio>
#include <cstring>
#include <iomanip>
#include <iostream>
#include <algorithm>
#define MAX 200010
#define INF 1e15
using namespace std;
  
struct Point{
    double x,y;
  
    bool operator <(const Point &a)const {
        return x < a.x;
    }
    void Read() {
        scanf("%lf%lf",&x,&y);
    }
}point[MAX],L[MAX],R[MAX];
  
inline bool cmp(const Point &p1,const Point &p2)
{
    retu
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值