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:\) 昨天才学完平面最近点对,今天就要求平面最近的三个点,显然不是巧合. 仔细一思考,我们用来求平面最近点对的方法不就可以用到三个点上吗? 就 ...
随机推荐
- JS实现数组去重的方法(6种)
方法一: 双层循环,外层循环元素,内层循环时比较值 如果有相同的值则跳过,不相同则push进数组 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 Arra ...
- linux面试集
shell:1.$# 和 $*之类的特殊变量 特殊变量列表 变量 含义 $0 当前脚本的文件名 $n 传递给脚本或函数的参数.n是一个数字,表示第几个参数.例如,第一个参数就是$1 $# 传递给脚本或 ...
- PHP获取异常信息
try { } catch (\Exception $e) { $extra = [ 'code' => $e->getCode(), 'msg' => $e->getMess ...
- 深度CNN
[具体参考可以看这里(https://cloud.tencent.com/developer/article/1369425)
- 输入cin对象的用法
#include<iostream> using namespace std; int main() { int carrots ; cout << "How man ...
- python基础之内置函数补充、匿名函数、递归函数
内置函数补充 python divmod()函数:把除数和余数运算结果结合起来,返回一个包含商和余数的元组(a // b, a % b) 语法: 1 divmod(a, b) #a.b为数字,a为除数 ...
- scala高级特性-01
目标一:深入理解高阶函数 高阶函数 1.1概念 Scala混合了面向对象和函数式的特性, 我们通常将可以做为参数传递到方法中的表达式叫做函数. 在函数式编程语言中,函数是“头等公民”, 高阶函数包含: ...
- Android Kotlin 连接 http
由于近期网上搜索了很多Android连接到http的方法, 可是2013年以前的方法现在都不能用了,要么报错,要么被遗弃,岁月留下来的东西只能自己整理了. 其实很简单,就一个HttpUtil通用类.可 ...
- PHP.TP框架下商品项目的优化3-php封装下拉框函数
php封装下拉框函数 因为在项目中会经常使用到下拉框,所以根据一个表中的数据制作下拉框函数,以便调用 //使用一个表的数据做下拉框函数 function buildSelect($tableName, ...
- idea无法新建maven项目
之前用的都是eclipse,自从4月底入职新公司后,接触到了idea. 然后自己的电脑上也安装了idea,不过一直都没用,直到昨天打算开起来使用一下. 之后就是想新建一个maven项目,发现死活也新建 ...