分治就是了.

类似于分治找最近/远点对.

CODE

#include <bits/stdc++.h>
using namespace std;
const double eps = 1e-13;
const int MAXN = 200005;
const double INF = 1e15;
#define sqr(x) ((x)*(x))
struct Point {
double x, y;
Point(){}
Point(double x, double y):x(x), y(y){}
inline friend double dist(const Point &A, const Point &B) {
return sqrt(sqr(A.x-B.x) + sqr(A.y-B.y));
}
inline friend double S_tri(const Point &A, const Point &B, const Point &C) {
return dist(A, B) + dist(A, C) + dist(B, C);
}
}a[MAXN];
inline bool cmpx(const Point &A, const Point &B) { return A.x < B.x; }
inline bool cmpy(const Point &A, const Point &B) { return A.y < B.y; }
int n;
double solve(int l, int r) {
if(r-l < 2) return INF;
if(r-l == 2) return S_tri(a[l], a[l+1], a[l+2]);
int mid = (l + r) >> 1; double X = a[mid].x;
double re = min(solve(l, mid-1), solve(mid+1, r));
int st = l, ed = r;
while(X-a[st].x > re/2) ++st;
while(a[ed].x-X > re/2) --ed;
sort(a + st, a + ed + 1, cmpy);
for(int i = st; i <= ed; ++i)
for(int j = i+1; j <= ed; ++j)
if(dist(a[i], a[j]) + eps > re/2) break; //剪枝必须加
else for(int k = j+1; k <= ed; ++k)
if(dist(a[i], a[k]) + eps > re/2) break;
else re = min(re, S_tri(a[i], a[j], a[k]));
sort(a + st, a + ed + 1, cmpx);
return re;
}
int main() {
scanf("%d", &n);
for(int i = 1; i <= n; ++i)
scanf("%lf%lf", &a[i].x, &a[i].y);
sort(a + 1, a + n + 1, cmpx);
printf("%.6f\n", solve(1, n));
}

BZOJ 2458: [BeiJing2011]最小三角形 (分治)的更多相关文章

  1. bzoj 2458: [BeiJing2011]最小三角形 题解

    [前言]话说好久没有写题解了.到暑假了反而忙.o(╯□╰)o [原题] 2458: [BeiJing2011]最小三角形 Time Limit: 10 Sec  Memory Limit: 128 M ...

  2. BZOJ 2458: [BeiJing2011]最小三角形 | 平面分治

    题目: 给出若干个点 求三个点构成的周长最小的三角形的周长(我们认为共线的三点也算三角形) 题解: 可以参考平面最近点对的做法 只不过合并的时候改成枚举三个点更新周长最小值,其他的和最近点对大同小异 ...

  3. [BZOJ]2458: [BeiJing2011]最小三角形

    题目大意:给出平面上n个点,求最小的由这些点组成的三角形的周长.(N<=200,000) 思路:点按x坐标排序后分治,每次取出与排在中间的点的横坐标相差不超当前答案一半的点,按y坐标排序后再暴力 ...

  4. bzoj-2458 2458: [BeiJing2011]最小三角形(计算几何+分治)

    题目链接: 2458: [BeiJing2011]最小三角形 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1101  Solved: 380 Des ...

  5. [BZOJ2458][BeiJing2011]最小三角形(分治)

    求平面上n个点组成的周长最小的三角形. 回忆平面最近点对的做法,找到横坐标的中点mid分治到两边,合并时考虑离mid横坐标不超过当前最小值d的所有点,按y排序后暴力更新答案. 这个题也一样,先分治到两 ...

  6. 分治 - 计算几何 - BZOJ2458,[BeiJing2011]最小三角形

    http://www.lydsy.com/JudgeOnline/problem.php?id=2458 [BeiJing2011]最小三角形 描述 Frisk现在遇到了一个有趣的问题. 平面上有N个 ...

  7. bzoj2458: [BeiJing2011]最小三角形(分治+几何)

    题目链接:bzoj2458: [BeiJing2011]最小三角形 学习推荐博客:分治法编程问题之最接近点对问题的算法分析 题解:先将所有点按x值排列,然后每次将当前区间[l,r]分成左右两半递归求解 ...

  8. BZOJ2458 Beijing2011最小三角形(分治)

    类似于平面最近点对,考虑分治,即分别计算分割线两侧的最小三角形再考虑跨过线的三角形. 复杂度证明也是类似的,对于某一个点,在另一侧可能与其构成最小三角形的点在一个d*d/2的矩形内(两边之和大于第三边 ...

  9. BZOJ2458: [BeiJing2011]最小三角形

    类似分治最近点对的方法乱搞一下就行. #include<bits/stdc++.h> #define N 200010 #define M (s+t>>1) using nam ...

随机推荐

  1. 《C程序设计语言》学习笔记

    1. 在C程序中,如果字符串过长而需要跨行时,要在换行时加上“\”. printf("Hello, world"); // error printf("Hello, wo ...

  2. Django soft-delete软删除

    在django中,实现这个功能很简单,我们采用一个字段用来保存删除的时间.若记录没有被删除,那么设置该值为None,如果被删除,那么设置时间为删除的时间. class BaseSchema(model ...

  3. sysbench的简单安装

    1. 下载 可以到网站上面找 我用到的这个是201908最新的 wget https://src.fedoraproject.org/repo/pkgs/sysbench/sysbench-1.0.1 ...

  4. 【AtCoder】M-SOLUTIONS Programming Contest

    M-SOLUTIONS Programming Contest A - Sum of Interior Angles #include <bits/stdc++.h> #define fi ...

  5. NIT校赛-- 雷顿女士与平衡树

    题意:https://ac.nowcoder.com/acm/contest/2995/E 给你一棵树,节点有权值,让你求所有路径max-min的和. 思路: 我们计算每个点的贡献,对于一个点,当它为 ...

  6. HDU 4417-Super Mario-线段树+离线

    Description Mario is world-famous plumber. His "burly" figure and amazing jumping ability ...

  7. thinkphp5日志文件权限的问题

    由于www用户和root用户(比如command的cli进程日志)都有可能对log文件进行读写. 如果是由www用户创建的log文件,不会出任何问题. 但是如果是先由root用户创建的log文件,然后 ...

  8. RBAC授权

    RBAC RBAC使用rbac.authorization.k8s.io API Group 来实现授权决策,允许管理员通过 Kubernetes API 动态配置策略,要启用RBAC,需要在 api ...

  9. c# 自定义解析JSON字符串数据

    解析json字符串有很多方式, 1 : 在网上下载json解析的dll类库并添加引用, 调用相关方法; 2 : 使用自带类库JavaScriptSerializer的序列号和反序列化; 对于以上两个方 ...

  10. sql游标循环

    DECLARE @begindate DATETIME=CONVERT(DATETIME, '2019.05.06 09:40:50') ,@enddate DATETIME =GETDATE() , ...