BZOJ 2458: [BeiJing2011]最小三角形 (分治)
分治就是了.
类似于分治找最近/远点对.
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]最小三角形 (分治)的更多相关文章
- bzoj 2458: [BeiJing2011]最小三角形 题解
[前言]话说好久没有写题解了.到暑假了反而忙.o(╯□╰)o [原题] 2458: [BeiJing2011]最小三角形 Time Limit: 10 Sec Memory Limit: 128 M ...
- BZOJ 2458: [BeiJing2011]最小三角形 | 平面分治
题目: 给出若干个点 求三个点构成的周长最小的三角形的周长(我们认为共线的三点也算三角形) 题解: 可以参考平面最近点对的做法 只不过合并的时候改成枚举三个点更新周长最小值,其他的和最近点对大同小异 ...
- [BZOJ]2458: [BeiJing2011]最小三角形
题目大意:给出平面上n个点,求最小的由这些点组成的三角形的周长.(N<=200,000) 思路:点按x坐标排序后分治,每次取出与排在中间的点的横坐标相差不超当前答案一半的点,按y坐标排序后再暴力 ...
- bzoj-2458 2458: [BeiJing2011]最小三角形(计算几何+分治)
题目链接: 2458: [BeiJing2011]最小三角形 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1101 Solved: 380 Des ...
- [BZOJ2458][BeiJing2011]最小三角形(分治)
求平面上n个点组成的周长最小的三角形. 回忆平面最近点对的做法,找到横坐标的中点mid分治到两边,合并时考虑离mid横坐标不超过当前最小值d的所有点,按y排序后暴力更新答案. 这个题也一样,先分治到两 ...
- 分治 - 计算几何 - BZOJ2458,[BeiJing2011]最小三角形
http://www.lydsy.com/JudgeOnline/problem.php?id=2458 [BeiJing2011]最小三角形 描述 Frisk现在遇到了一个有趣的问题. 平面上有N个 ...
- bzoj2458: [BeiJing2011]最小三角形(分治+几何)
题目链接:bzoj2458: [BeiJing2011]最小三角形 学习推荐博客:分治法编程问题之最接近点对问题的算法分析 题解:先将所有点按x值排列,然后每次将当前区间[l,r]分成左右两半递归求解 ...
- BZOJ2458 Beijing2011最小三角形(分治)
类似于平面最近点对,考虑分治,即分别计算分割线两侧的最小三角形再考虑跨过线的三角形. 复杂度证明也是类似的,对于某一个点,在另一侧可能与其构成最小三角形的点在一个d*d/2的矩形内(两边之和大于第三边 ...
- BZOJ2458: [BeiJing2011]最小三角形
类似分治最近点对的方法乱搞一下就行. #include<bits/stdc++.h> #define N 200010 #define M (s+t>>1) using nam ...
随机推荐
- 【Python】【demo实验36】【基础实验】【求3*3矩阵的主对角线之和】
题目: 求一个3*3矩阵主对角线元素之和. 主对角线:从左上多右下的书归为主对角线 副对角线:从左下至右上的数归为副对角线. 我的源码: #!/usr/bin/python # encoding=ut ...
- bat命令教程
转自:https://www.jb51.net/article/151923.htm 第一章 批处理基础 第一节 常用批处理内部命令简介 批处理定义:顾名思义,批处理文件是将一系列命令按一定的顺序集合 ...
- Nginx04---编译安装
原文:https://www.cnblogs.com/zhang-shijie/p/5294162.html 一:基介绍 官网地址www.nginx.org,nginx是由1994年毕业于俄罗斯国立莫 ...
- Kubernetes组件-DaemonSet
⒈简介 Replicationcontroller和ReplicaSet都用于在Kubermetes集群上部署运行特定数量的pod.但是,当某些情况下我们希望在集群中的每个节点上运行同一个指定的pod ...
- PostgreSQL练习3
select dname,count(ename),avg(sal),sum(sal) from emp e,dept d where e.deptno=d.deptno group by dname ...
- Centos7下永久修改mysql5.6最大连接数
由于解除系统限制,设置最大连接数时,量力而行.https://blog.csdn.net/five3/article/details/79671317
- ubuntu+nginx+uwsgi部署django web项目
前言 将本地开发的django项目部署至linux上的uwsgi服务器,并配置nginx,完成基于ubuntu+nginx+uwsgi的上线运行.下面整理相关步骤. 服务器配置virtualenv 如 ...
- 怎样快捷获取元素节点head
1. 使用: document.head document.head.nodeName; // "HEAD" 2. 使用: document.getElementsByTagNam ...
- iview-admin部署linux nginx报500错误的问题记录
遇到个新服务器部署iview-admin之后 在nginx配置文件有个user配置项 这里需要配置为root或者可以读取本地文件的用户 站点配置如下 server { listen ; server_ ...
- hexo发布后样式丢失
修改配置中url路径,和root,问题解决.