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. 常用docker

    随便什么版本的linux 接入daocloud.io 在发现镜像中选择DockerHub 搜索对应的image,然后部署. 手动输入YAML即可 aria: image: cuteribs/aria2 ...

  2. kbmMW TkbmMWHashSHA256与Delphi 10.2 THashSHA2算出相同的结果

    procedure TForm2.Button3Click(Sender: TObject); var hashed:string; begin hashed:=TkbmMWHashSHA256.Ha ...

  3. 解决Viewpager满屏不能自适应填充内容的三种办法

    由于排版问题,本人博客园同名博文地址为:http://www.cnblogs.com/bill-technology/articles/3143667.html 很多Android开发者在使用View ...

  4. git stash,git cherry-pick

    git stash: 备份当前的工作区的内容,从最近的一次提交中读取相关内容,让工作区保证和上次提交的内容一致.同时,将当前的工作区内容保存到Git栈中.git stash pop: 从Git栈中读取 ...

  5. git log 退出方法

    前言 使用git的过程中会有一些疑问,理当记录,方便自己随时查看,可能也会帮助他人解惑,甚好! 1.git log退出方法 使用git log之后无法回到主页面,如下图所示,最后只能暴力关闭git b ...

  6. Vue实现刷新当前路由

    Vue点击当前路由实现刷新 Vue点击当前路由实现刷新思路Code实现效果 前言:在后台管理系统中,有这样一个需求点击当前菜单栏时,页面依旧可以刷新. 点击当前路由实现数据请求页面刷新 思路 点击当前 ...

  7. OVSSL企业证书认证

    最近,在做http->https的转化,虽然我没有操作证书的安装过程,但是在这个过程中学习到不少知识呢. 因为我没有操作,所以操作上我就不知道了.下面是这个过程中要注意的一些事项: 1.公司名称 ...

  8. jboss 5.1 启动问题解决

    在安装好后启动时可能遇到这样的情况: ERROR [AbstractKernelController] Error installing to Instantiated: name=Attachmen ...

  9. FutureTask的用法及两种常用的使用场景 + FutureTask的方法执行示意图

    from:  https://blog.csdn.net/linchunquan/article/details/22382487 FutureTask可用于异步获取执行结果或取消执行任务的场景.通过 ...

  10. 【java规则引擎】《Drools7.0.0.Final规则引擎教程》第4章 4.1 规则文件

    转载至:https://blog.csdn.net/wo541075754/article/details/75150267 一个标准的规则文件的格式为已“.drl”结尾的文本文件,因此可以通过记事本 ...