BZOJ 2458: [BeiJing2011]最小三角形 | 平面分治
题目:
给出若干个点
求三个点构成的周长最小的三角形的周长(我们认为共线的三点也算三角形)
题解:
可以参考平面最近点对的做法
只不过合并的时候改成枚举三个点更新周长最小值,其他的和最近点对大同小异
2#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#define N 200010
#define INF 1e20
using namespace std;
int n;
struct point
{
double x,y;
point () {};
point (double _x,double _y)
{
x=_x,y=_y;
}
point operator - (const point &a)const
{
return point(x-a.x,y-a.y);
}
bool operator < (const point &a)const
{
return x<a.x;
}
double norm()
{
return sqrt(x*x+y*y);
}
}p[N];
double calc(const point &x,const point &y,const point &z)
{
return (x-y).norm()+(y-z).norm()+(x-z).norm();
}
double solve(int l,int r)
{
if (r==l) return INF;
int mid=l+r>>1;
double xmid=(p[mid].x+p[mid+1].x)/2;
double ret=min(solve(l,mid),solve(mid+1,r));
static point a[N],b[N],c[N];
int pos=l,i=l,j=mid+1,b_n=0,c_n=0;
while (pos<=r)
{
if (i<=mid && (p[i].y<p[j].y || j>r))
{
if (p[i].x+ret/2>xmid)
b[++b_n]=p[i];
a[pos++]=p[i++];
}
else
{
if (p[j].x-ret/2<xmid)
c[++c_n]=p[j];
a[pos++]=p[j++];
}
}
for (i=l;i<=r;i++)
p[i]=a[i];
if (r-l<2) return INF;
/*
for (int i=1;i<=b_n;i++)
for (int j=i+1;j<=b_n;j++)
for (int k=1;k<=c_n;k++)
if (i!=j) ret=min(ret,(b[i]-b[j]).norm()+(b[i]-c[k]).norm()+(b[j]-c[k]).norm());
for (int i=1;i<=b_n;i++)
for (int j=1;j<=c_n;j++)
for (int k=j+1;k<=c_n;k++)
if (j!=k) ret=min(ret,(b[i]-c[j]).norm()+(b[i]-c[k]).norm()+(c[j]-c[k]).norm());
*/
// /*
for (int i=1,j=1;i<=b_n;i++)
{
while (j<=c_n && b[i].y-c[j].y>ret/2) j++;
for (int k=j;k<=c_n && abs(b[i].y-c[k].y)<ret/2;k++)
for (int h=k+1;h<=c_n && abs(b[i].y-c[h].y)<ret/2;h++)
ret=min(ret,calc(b[i],c[k],c[h]));
}
for (int i=1,j=1;i<=c_n;i++)
{
while (j<=b_n && c[i].y-b[j].y>ret/2) j++;
for (int k=j;k<=b_n && abs(c[i].y-b[k].y)<ret/2;k++)
for (int h=k+1;h<=b_n && abs(c[i].y-b[h].y)<ret/2;h++)
ret=min(ret,calc(c[i],b[k],b[h]));
}
// */
return ret;
}
int main()
{
scanf("%d",&n);
for (int i=1;i<=n;i++)
scanf("%lf%lf",&p[i].x,&p[i].y);
sort(p+1,p+1+n);
printf("%.6lf",solve(1,n));
return 0;
}
BZOJ 2458: [BeiJing2011]最小三角形 | 平面分治的更多相关文章
- bzoj 2458: [BeiJing2011]最小三角形 题解
[前言]话说好久没有写题解了.到暑假了反而忙.o(╯□╰)o [原题] 2458: [BeiJing2011]最小三角形 Time Limit: 10 Sec Memory Limit: 128 M ...
- bzoj-2458 2458: [BeiJing2011]最小三角形(计算几何+分治)
题目链接: 2458: [BeiJing2011]最小三角形 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1101 Solved: 380 Des ...
- BZOJ 2458: [BeiJing2011]最小三角形 (分治)
分治就是了. 类似于分治找最近/远点对. CODE #include <bits/stdc++.h> using namespace std; const double eps = 1e- ...
- [BZOJ]2458: [BeiJing2011]最小三角形
题目大意:给出平面上n个点,求最小的由这些点组成的三角形的周长.(N<=200,000) 思路:点按x坐标排序后分治,每次取出与排在中间的点的横坐标相差不超当前答案一半的点,按y坐标排序后再暴力 ...
- bzoj2458: [BeiJing2011]最小三角形(分治+几何)
题目链接:bzoj2458: [BeiJing2011]最小三角形 学习推荐博客:分治法编程问题之最接近点对问题的算法分析 题解:先将所有点按x值排列,然后每次将当前区间[l,r]分成左右两半递归求解 ...
- BZOJ 2458 最小三角形 | 平面分治
BZOJ 2458 最小三角形 题面 一个平面上有很多点,求他们中的点组成的周长最小的三角形的周长. 题解 跟平面最近点对差不多,也是先把区间内的点按x坐标从中间分开,递归处理,然后再处理横跨中线的三 ...
- BZOJ2458 Beijing2011最小三角形(分治)
类似于平面最近点对,考虑分治,即分别计算分割线两侧的最小三角形再考虑跨过线的三角形. 复杂度证明也是类似的,对于某一个点,在另一侧可能与其构成最小三角形的点在一个d*d/2的矩形内(两边之和大于第三边 ...
- 分治 - 计算几何 - BZOJ2458,[BeiJing2011]最小三角形
http://www.lydsy.com/JudgeOnline/problem.php?id=2458 [BeiJing2011]最小三角形 描述 Frisk现在遇到了一个有趣的问题. 平面上有N个 ...
- [BJWC2011]最小三角形(分治+最近点对)
题面:BJWC2011 最小三角形 \(solution:\) 昨天才学完平面最近点对,今天就要求平面最近的三个点,显然不是巧合. 仔细一思考,我们用来求平面最近点对的方法不就可以用到三个点上吗? 就 ...
随机推荐
- Lucene检索提高性能的几个方式
1.采用最新版本的Lucene 2.索引文件存储采用本地文件系统,如果需要挂载远程系统,请采用 readonly方式. 3.当然采用更好的硬件,更高I/O的磁盘 4.提高OS 缓存,调整参数 5.提高 ...
- CCS选择器基础
上周学习了HTML和css的一些基础,今天来夯实一下基础 选择器有: 1.标签选择器 :就是HTML 中的标签 如<p> <h1> <body>等 2.类选择器: ...
- 彻底搞定C指针--“函数名与函数指针”
函数名与函数指针 一 通常的函数调用 一个通常的函数调用的例子: //自行包含头文件 void MyFun(int x); //此处的申明也可写成:void MyFun( int ); 点击打开链 ...
- pycharm中文乱码问题 总结
前言: 这几天刚刚开始学习python,然后就安装了pycharm,但是那个中文乱码的问题真是让人心烦,在网上找了好久,都写得好乱,今天终于让我解决了,在这里总结一下经验,希望可以帮到你们 问题:如下 ...
- VIM配置IDE
转载于:https://blog.csdn.net/andre617/article/details/53496490#%E8%84%9A%E6%B3%A8 由于YCM需要vim支持python,需要 ...
- 尺取法 poj 2566
尺取法:顾名思义就是像尺子一样一段一段去取,保存每次的选取区间的左右端点.然后一直推进 解决问题的思路: 先移动右端点 ,右端点推进的时候一般是加 然后推进左端点,左端点一般是减 poj 2566 题 ...
- 購買管理(MM)
■購買管理■ [購買伝票]EKKO: ヘッダ EKPO: 明細 EKET: 納入日程行 EKPA: 取引先機能 EKKN: 勘定設定 EKBE: 後続伝票 EKBEH: 削除済み後続伝票履歴 [請求書 ...
- oracle11g导出表时空表导不出解决方案
oracle11g用exp命令导出数据库表时,有时会发现只导出了一部分表时而且不会报错,原因是有空表没有进行导出,之前一直没有找到方法于是用最笨的方法重新建这些空表,当然在我们实际当中表的数量大时我们 ...
- javascript的js调用
本来从一开始接触编程开始,自己就一直写后端,但是对于前端真的不会,但是没办法呀,公司要做,所以,好吧,开始了写一写简单的javascript的内容其中,在xxx.jsp页面中出现了这个 <a c ...
- Flume使用(案例分析)
Flume官方文档 Usage: bin/flume-ng <command> [options]... commands: help display this help text age ...