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:\) 昨天才学完平面最近点对,今天就要求平面最近的三个点,显然不是巧合. 仔细一思考,我们用来求平面最近点对的方法不就可以用到三个点上吗? 就 ...
随机推荐
- PowerDesigner生成sql脚本
1.打开PowerDesigner->New Project; 2.填写项目名称,选择文件的存放路径: 3.新建一个模型,New Model: 4.选择概念模型,填写模型名称: 5.选择enti ...
- Percona-Tookit工具包之pt-mext
Preface We are always obliged to analyze many outputs generated by various tools directly ev ...
- js将人民币数字转大写
function numberToUpper(money) { var cnNums = new Array("零", "壹", "贰", ...
- JZOJ| 5910. DuLiu
Description LF是毒瘤出题人中AK IOI2019,不屑于参加NOI的唯一的人.他对人说话,总是满口垃圾题目者也,教人半懂不懂的.因为他姓李,别人便从QQ群上的“毒瘤李F ...
- stark组件(7):增加分页功能
效果图: 分页部分代码: # 1.分页处理 all_count = self.model_class.objects.all().count() query_params = request.GET. ...
- SPOJ1026 概率DP
Favorite Dice BuggyD loves to carry his favorite die around. Perhaps you wonder why it's his favorit ...
- python——PIL(图像处理库)
PIL(Python Imaging Library,python图像处理库)提供了通用的图像处理功能,以及大量有用的基本图像操作,如图像缩放,裁剪,旋转,颜色转换等. 1.打开图像并显示 from ...
- Black Box POJ1442
Description Our Black Box represents a primitive database. It can save an integer array and has a sp ...
- EF实体部分更新的问题
之前遇到只更新部分的问题:如前端修改用户信息(不修改密码),传实体到后台,这个实体是没有密码,这样一来要更新的话,得先去数据库通过传过来的实体的ID读取这条记录,然后将改动的部分填到查出来的记录中,再 ...
- Weblogic Linux jar包安装
环境/工具: 系统:CentOS 7 JDK:Oracle JDK fmw_12.2.1.2.0_wls.jar 0x01.新建普通用户weblogic 在Linux环境下建议使用普通用户安装,web ...