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:\) 昨天才学完平面最近点对,今天就要求平面最近的三个点,显然不是巧合. 仔细一思考,我们用来求平面最近点对的方法不就可以用到三个点上吗? 就 ...
随机推荐
- scoped,会使设置UI组件库的样式识别不出来
未设置 scoped 作用域:显示效果 设置作用域的效果:ui组件默认的值(你怎么设置都不管用)
- 【Mysql】给mysql配置远程登录
grant all privileges on 库名.表名 to '用户名'@'IP地址' identified by '密码' with grant option; flush privileges ...
- TA-LIB】之MACD
移动平滑异同平均线(Moving Average Convergence Divergence,简称MACD指标)策略.MACD是查拉尔·阿佩尔(Geral Appel)于1979年提出的,由一快及一 ...
- asp.net core-项目开发中问题汇总
无法启动进程\Program File\dotnet\dotnet.exe.进程创建失败,出现错误:系统找不到指定的文件如下图: 解放方案:1.修改系统环境变量 2.重启电脑
- 【机器学习算法基础+实战系列】SVM
概述 支持向量机是一种二分类模型,间隔最大使它有别于感知机.支持向量机学习方法由简至繁的模型:线性可分支持向量机(linear support vector machine in linearly s ...
- 裸机——RTC
1. 首先晓得RTC的基本知识 RTC被划分到timer,但RTC是面向时间点的. 如果按照定时器的思路去思考,那么应该考虑 时间周期 和 计数值. RTC 不是面向时间点的,所以略有不同, 时间周期 ...
- C++基础 new和delete
1.new delete 的使用 (1)基本数据类型 ); delete p; int *p = (int *)malloc(sizeof(int)); *p = ;free(p); (2)数组 ]; ...
- Ubuntu 14.10 配置JDK + J2EE
本文仅作为本人在Ubuntu 14.10下安装JDK + J2EE的一个记录: 安装JDK 从Oracle的官网下载jdk-7u75-linux-x64.tar.gz 将jdk-7u75-linux- ...
- samba server on Mac OS X Lion Server
一般Mac共享通过配置wins,smb即可实现.注意在同一个工作组! 参考:http://computers.tutsplus.com/tutorials/how-to-set-up-an-smb-s ...
- iOS算法笔记-快速排序-OC实现
快速排序(Quicksort)是对冒泡排序的一种改进. 快速排序由C. A. R. Hoare在1962年提出.它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另 ...