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. JQuery初识(三 )

    一丶JQuery的文档操作 1.插入操作: 父元素.append(子元素) 解释:追加某元素,在父元素中添加新的子元素.子元素可以为:stirng|element(js对象)|JQuery元素 var ...

  2. eaysui 子页面刷新父页面datagrid

    近期碰到这样一个问题,子页面操作后需要刷新父页面datagrid元素,刚开始用这种方式刷新,$("#talbe",window.parent.document).datagrid( ...

  3. Java图形界面开发—简易登录注册小程序

    登录注册小代码,将学过的一些小知识融合在一起进行了使用,加深印象.本例中如果有注释不详细的地方,详见其它博客. Java程序操作数据库SQLserver详解 功能介绍:简单的登录注册系统,使用了数据库 ...

  4. python3对多线程处理

    参考博客: https://blog.csdn.net/u010339879/article/details/86506450 https://blog.csdn.net/qq_33961117/ar ...

  5. [Jira]启动报错无法删除缓存文件felix-cache的解决方法

    背景: 由于公司机房停电,jira服务器在停电期间需要关机处理,然而待重启启动服务时,jira出现报错,页面报错信息如下: Unable to clean the cache directory: / ...

  6. 网页编辑器CKEditor4.3.1+CKFinder2.4+JW Player6.7(视频播放器)集成

    CKEditor是使用最多的一款在线网页编辑器,不仅好用,而且功能强大.易扩展.浏览器兼容性好.另外,CKEditor网页编辑器经常更新.本程序使用的是最新稳定版CKEditor4.3.1,添加使用了 ...

  7. 爬虫技术-httpClent+jsoup

    技术:httpClent+jsoup 任务:利用httpClent爬去网站信息,在利用jsoup解析 方法说明: parseUrl(String url):传入相应的url返回该网页内容,网页必须是h ...

  8. PPPOE+FREERADIUS+MYSQL+LINUX

    环境: OS:Linux Centos 6.9 x86_x64 PPPOE : ppp-2.4.7.tar.gz   rp-pppoe-3.12.tar.gz FreeRadius : V3.0.X ...

  9. codeblocks winsock配置

    在codeblocks进行Socket编程遇到如下情况: undefined reference to WSAStartup@8 解决方法: 右击工程,选择 build options,选择 Link ...

  10. Flutter Json序列号和反序列化遇到问题 Missing "part 'xxx.g.dart';"

    /** * * 1.@JsonSerializable() 这是表示告诉编译器这个类是需要生成Model类的 * 2,@JsonKey 由于服务器返回的部分数据名称在Dart语言中是不被允许的, * ...