Description

Xaviera现在遇到了一个有趣的问题。
平面上有N个点,Xaviera想找出周长最小的三角形。
由于点非常多,分布也非常乱,所以Xaviera想请你来解决这个问题。
为了减小问题的难度,这里的三角形也包括共线的三点。

Input

第一行包含一个整数N表示点的个数。
接下来N行每行有两个整数,表示这个点的坐标。

Output

输出只有一行,包含一个6位小数,为周长最短的三角形的周长(四舍五入)。

首先旋转坐标系防止被卡。
将点排序,分割为左右/上下两部分,对每个子问题分别排序,直至子问题足够小时暴力枚举。
利用子问题求得的当前最优解ans缩小范围,将两个子问题在分界直线两侧距离<ans/2的点进行枚举。
#include<cstdio>
#include<algorithm>
#include<cmath>
double ans=1.0e16;
int w=;
struct pos{
double x[];
}ps[];
bool operator<(const pos &a,const pos &b){
return a.x[w]<b.x[w];
}
double dist(pos &a,pos &b){
double x=a.x[]-b.x[],y=a.x[]-b.x[];
return sqrt(x*x+y*y);
}
void f(int _w,int l,int r){
if(l+>r){
for(int i=l;i<r;i++)
for(int j=i+;j<r;j++)
for(int k=j+;k<=r;k++){
double v=dist(ps[i],ps[j])+dist(ps[i],ps[k])+dist(ps[j],ps[k]);
if(v<ans)ans=v;
}
return;
}
w=_w;
std::sort(ps+l,ps+r+);
int m=l+r>>;
f(_w^,l,m);
f(_w^,m+,r);
w=_w;
std::sort(ps+l,ps+m+);
std::sort(ps+m+,ps+r+);
int p1=m,p2=m+;
int a=ans*0.5+,x1=ps[m].x[_w],x2=ps[m+].x[_w];
while(p1>l&&ps[p1-].x[_w]+a>=x1)--p1;
while(p2<r&&ps[p2+].x[_w]-a<=x2)++p2;
w^=;
std::sort(ps+p1,ps+m+);
std::sort(ps+m+,ps+p2+);
for(int i=p1;i<=m;i++){
int p3=m+,p4=p2;
while(p3<p2&&ps[p3+].x[w]+a<ps[i].x[w])++p3;
while(p4>m+&&ps[p4-].x[w]-a>ps[i].x[w])--p4;
for(int j=p3;j<p4;j++)
for(int k=j+;k<=p4;k++){
double v=dist(ps[i],ps[j])+dist(ps[i],ps[k])+dist(ps[j],ps[k]);
if(v<ans)ans=v;
}
}
for(int i=m+;i<=p2;i++){
int p3=p1,p4=m;
while(p3<p2&&ps[p3+].x[w]+a<ps[i].x[w])++p3;
while(p4>m+&&ps[p4-].x[w]-a>ps[i].x[w])--p4;
for(int j=p3;j<p4;j++)
for(int k=j+;k<=p4;k++){
double v=dist(ps[i],ps[j])+dist(ps[i],ps[k])+dist(ps[j],ps[k]);
if(v<ans)ans=v;
}
}
}
int n;
int main(){
scanf("%d",&n);
for(int i=;i<n;i++)scanf("%lf%lf",&ps[i].x[],&ps[i].x[]);
double c=cos(0.8),s=sin(0.8);
for(int i=;i<n;i++){
double x=ps[i].x[],y=ps[i].x[];
ps[i].x[]=c*x+s*y;
ps[i].x[]=-s*x+c*y;
}
f(,,n-);
printf("%.6lf",ans);
return ;
}

bzoj2458 最小三角形的更多相关文章

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

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

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

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

  3. BZOJ2458:[BJOI2011]最小三角形——题解

    http://www.lydsy.com/JudgeOnline/problem.php?id=2458 Description Xaviera现在遇到了一个有趣的问题. 平面上有N个点,Xavier ...

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

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

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

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

  6. [BJWC2011]最小三角形(分治+最近点对)

    题面:BJWC2011 最小三角形 \(solution:\) 昨天才学完平面最近点对,今天就要求平面最近的三个点,显然不是巧合. 仔细一思考,我们用来求平面最近点对的方法不就可以用到三个点上吗? 就 ...

  7. BZOJ 2458 最小三角形 | 平面分治

    BZOJ 2458 最小三角形 题面 一个平面上有很多点,求他们中的点组成的周长最小的三角形的周长. 题解 跟平面最近点对差不多,也是先把区间内的点按x坐标从中间分开,递归处理,然后再处理横跨中线的三 ...

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

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

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

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

随机推荐

  1. 给Ajax一个漂亮的嫁衣——Ajax系列之五(下)之序列化和反序列化

    给Ajax一个漂亮的嫁衣——Ajax系列之五(下)之序列化和反序列化 标签: ajaxdictionaryjsonobject服务器function 2012-07-25 18:41 2242人阅读  ...

  2. Oracle 备份与恢复 15 个典型问题

    1.问:Oracle11g数据库数据量有50T,每天增量50g左右,该如何制定备份方案,如何验证备份的有效性? 答:50T的数据也不大,运营商的地市级市数据基本都在100T以上了,只要备份环境允许的话 ...

  3. ACdream 1067:Triangles

    Problem Description 已知一个圆的圆周被N个点分成了N段等长圆弧,求任意取三个点,组成锐角三角形的个数. Input 多组数据,每组数据一个N(N <= 1000000) Ou ...

  4. MyEclipse移动开发教程:设置所需配置的iOS应用(三)

    MyEclipse个人授权 折扣低至冰点!立即开抢>> [MyEclipse最新版下载] 三.创建配置文件 Provisioning profiles授权文件应用程序在iOS设备上安装并运 ...

  5. svn断开重连,避免重建工作空间

    1. 右键项目-->Team-->断开连接 2.选择从文件系统中删除SVN元信息 3.右键项目-->Team-->share project-->svn 4.创建新的资源 ...

  6. php 文件上传处理

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAS4AAACvCAIAAADMuaTdAAAcaklEQVR4nO2da3Abx33Az3H6JdNx2i

  7. Ubuntu使用Remastersys封装制作系统ISO镜像

    首先下载Remastersys的Deb软件包 链接:http://pan.baidu.com/s/1i3tYPKT 密码:qvyd 使用命令强制安装 dpkg --force-all -i remas ...

  8. windows server 账号克隆

    在dos命令行下隐藏用户的方法:   net user 账户 密码 /add 如果在账号后加 $ 符号 这个账户在cmd命令行下是无法看见的 首先我们设置注册表权限 cmd = > regedt ...

  9. opencv-python教程学习系列13-图像平滑

    前言 opencv-python教程学习系列记录学习python-opencv过程的点滴,本文主要介绍图像平滑,坚持学习,共同进步. 系列教程参照OpenCV-Python中文教程: 系统环境 系统: ...

  10. 工具运行过程中,CPU占用过高的分析定位

    之前使用Java Swing开发了一款设备档案收集工具.支持多台设备同时收集,每个设备使用一个线程.在同时收集多台设备信息时,发现CPU占用率居然达到了97%,而且高居不下.显然这样的性能是令人无法忍 ...