http://www.lydsy.com/JudgeOnline/problem.php?id=2458

[BeiJing2011]最小三角形

描述

Frisk现在遇到了一个有趣的问题。

平面上有N个点,Frisk想找出周长最小的三角形。

由于点非常多,分布也非常乱,所以Frisk想请你来解决这个问题。

为了减小问题的难度,这里的三角形也包括共线的三点。

输入

第一行包含一个整数N表示点的个数。

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

输出

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

样例

输入
4
1 1
2 3
3 3
3 4
输出
3.414214

提示

100%的数据中N≤200000。


考试时失了智,只拿了半个暴力分

其实这和平面最近点对方法一毛一样

除了多了一层循环

代码蒯上

#include<iostream>
#include<iomanip>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<cstring>
#include<algorithm>
using namespace std;
inline int gotcha()
{
register int a=0;bool b=1;register char c=getchar();
while(c>'9' || c<'0'){if(c=='-')b=0;c=getchar();}
while(c>='0' && c<='9')a=a*10+c-48,c=getchar();
return b?a:-a;
}
const double EPS = 1e-9;
const int _ = 200002;
using namespace std;
struct point{double x,y;}p[_];
inline bool init_cmp(const point &a,const point &b){return a.x<b.x;}
inline bool cmp(const int &a,const int &b){return p[a].y<p[b].y;}
inline double xdis(const int &a,const int &b){return fabs(p[a].x-p[b].x);}
inline double ydis(const int &a,const int &b){return fabs(p[a].y-p[b].y);}
double dist(int a,int b){return sqrt(xdis(a,b)*xdis(a,b)+ydis(a,b)*ydis(a,b));}
int n,q[_],lq;
double finder(int l,int r)
{
if(r<l+2)return 1e33;
int i,j,k,mid=(l+r)>>1;
double dis=min(finder(l,mid),finder(mid+1,r));
lq=0;
for(i=l;i<=r;i++)if(xdis(i,mid)<=dis/2)q[++lq]=i;
sort(q+1,q+lq+1,cmp);
for(i=1;i<=lq-2;i++)
for(j=i+1;j<=lq-1 && ydis(q[i],q[j])<=dis/2;j++)
for(k=j+1;k<=lq && ydis(q[i],q[k])<=dis/2;k++)
dis=min(dis,dist(q[i],q[j])+dist(q[j],q[k])+dist(q[i],q[k]));
return dis;
}
int main()
{
register int i;
n=gotcha();
for(i=1;i<=n;i++)scanf("%lf%lf",&p[i].x,&p[i].y);
sort(p+1,p+n+1,init_cmp);
printf("%.6lf",finder(1,n));
return 0;
}

分治 - 计算几何 - BZOJ2458,[BeiJing2011]最小三角形的更多相关文章

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  8. BZOJ 2458: [BeiJing2011]最小三角形 (分治)

    分治就是了. 类似于分治找最近/远点对. CODE #include <bits/stdc++.h> using namespace std; const double eps = 1e- ...

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

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

随机推荐

  1. chart.js 使用方法 特别说明不是中文的

    以上是一个饼图的案例,其他统计类型查看文档 http://www.chartjs.org/docs/latest/charts/doughnut.html 注意看域名 chartjs.org  不是 ...

  2. cout格式化输出 详解

    //在使用setf等库函数时使用 //在使用流操纵算子时使用 //using namespace std; //以下所有的setf()都有对应的unsetf()用于取消设置 //所有的setiosfl ...

  3. Linux、命令ps 各字段意思

    参数: -A :所有的进程均显示出来,与 -e 具有同样的效用: -a : 显示现行终端机下的所有进程,包括其他用户的进程: -u :以用户为主的进程状态 : x :通常与 a 这个参数一起使用,可列 ...

  4. echo -e的用法

    root@bt:~# echo -e "HEAD /HTTP/1.0\n\n"HEAD /HTTP/1.0 root@bt:~# echo -e "HEAD /HTTP/ ...

  5. MySQL常用命令总结1

    默认已成功安装并配置MySQL,以下命令全部在CMD命令行窗口(Win10平台)中进行输入: mysql -uusername -ppassword //登录MySQL MYSQL -V //查看My ...

  6. html body上有一条空白!!!

    html body 上莫名其妙的就出现了一条空白,怎么搞都搞不定,弄了一下午...... 解决了!!! 格式问题/

  7. Atom打造轻量化C/C++ IDE

    写在前面 近期沉迷Atom的颜值无法自拔,在github的光环下,Atom凭借自身良好的素质,获得了大量开发者的青睐.随之而来的就是丰富的插件库,在插件帮助下,它对各种编程语言都有相当好的支持.对与一 ...

  8. Using Autorelease Pool Blocks

    https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmAut ...

  9. top命令交互快捷键

    #toptop - :: up :, users, load average: 0.17, 0.12, 0.14 Tasks: total, running, sleeping, stopped, z ...

  10. eclipse中关闭java文件后再打开,找不到如何切换可视化编辑器

    http://www.iteye.com/problems/64806 两种方式:   第一种正如楼上的老兄说的.在该java类中,鼠标右击,移动到openWith上 找到jigloo,找不到就在ot ...