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. 【转载】Android Bug分析系列:第三方平台安装app启动后,home键回到桌面后点击app启动时会再次启动入口类bug的原因剖析

    前言 前些天,测试MM发现了一个比较奇怪的bug. 具体表现是: 1.将app包通过电脑QQ传送到手机QQ上面,点击安装,安装后选择打开app (此间的应用逻辑应该是要触发 [闪屏页Activity] ...

  2. Redis (一) 概念安装

    一.阿里云安装Redis 1.安装Redis yum -y install redis 2.启动Redis service redis start 或者(推荐使用) systemctl start  ...

  3. js根据选中的复选框,隐藏那一行

    如图,选择复选框,点击“隐藏”按钮,隐藏选中行 1.JavaScript代码: function getCheckedIds() { var checkedSubject = $('#showSbgl ...

  4. numpy 小示例

    import numpy as np 生成 3*4 的由  0 组成的二维数组 >>> np.zeros((3,4)) array([[0., 0., 0., 0.], [0., 0 ...

  5. iOS9 http 不能连接的解决办法

    iOS9要求App内访问的网络必须使用HTTPS协议.原有的HTTP请求会报错,适配方法如下. 打开TARGETS-Build Phases, 添加New Run Script Phase,代码如下: ...

  6. vue-resource 上传图片

    const formData = new FormData()formData.append('file',img,params.name);formData.append('id',params.i ...

  7. BitBlt函数的绘制属性

    BOOL BitBlt(HDC hdcDest, int nXDest, int nYDest, int nWidth, int nHeight, HDC hdcSrc, int nXSrc, int ...

  8. arpg网页游戏特效播放(一)

    网页游戏中的特效,主要包括:场景特效,攻击特效和UI特效三种.场景特效是在地图层上播放的特效,攻击特效主要是技能触发的一些特效,UI特效是面板上的一些特效,还有一些在人物身上播放的特效,例如脚底光圈特 ...

  9. Size类型如何调用和定义

    cv::Size sz = cv::Size(PROB_W, PROB_H);//Size(srcimage.cols, srcimage.rows) groundtoimage(xylimit, u ...

  10. Unity 3D游戏-见缝插针源码

    Unity见缝插针功能实现 本文提供全流程,中文翻译.Chinar坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) 1 Sphere Rotatio ...