BZOJ2458:[BJOI2011]最小三角形——题解
http://www.lydsy.com/JudgeOnline/problem.php?id=2458
Description
Xaviera现在遇到了一个有趣的问题。
平面上有N个点,Xaviera想找出周长最小的三角形。
由于点非常多,分布也非常乱,所以Xaviera想请你来解决这个问题。
为了减小问题的难度,这里的三角形也包括共线的三点。
Input
第一行包含一个整数N表示点的个数。
接下来N行每行有两个整数,表示这个点的坐标。
Output
输出只有一行,包含一个6位小数,为周长最短的三角形的周长(四舍五入)。
Sample Input
1 1
2 3
3 3
3 4
Sample Output
HINT
100%的数据中N≤200000。
————————————————
哇作为练手平面分治的题我好高兴,一次A了。
不过最开始怀疑自己的思路有问题于是查了题解……然后发现竟然是对的。
额……
复述一下,和平面分治差不多,将solve函数的含义改为当前区间内最小三角形的周长。
然后我们发现对于一个三角形两点之间长度最大为d/2。
所以我们在归并排序y的时候把和中轴距离d/2的点捡出来。
然后三重循环枚举搞定(同时距离d/2不要忘了)
#include<cmath>
#include<cstdio>
#include<cctype>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
typedef double dl;
const dl INF=1e20;
const int N=;
inline int read(){
int X=,w=; char ch=;
while(!isdigit(ch)) {w|=ch=='-';ch=getchar();}
while(isdigit(ch)) X=(X<<)+(X<<)+(ch^),ch=getchar();
return w?-X:X;
}
struct node{
dl x;
dl y;
}p[N],a[N],b[N];
bool cmp(node A,node B){
return A.x<B.x;
}
inline dl dis(int i,int j){
return sqrt(pow(b[i].x-b[j].x,)+pow(b[i].y-b[j].y,));
}
dl solve(int l,int r){
if(l>=r)return INF;
int mid=(l+r)>>;
dl x0=(p[mid].x+p[mid+].x)/2.0;
dl d=min(solve(l,mid),solve(mid+,r));
int l1=l,r1=mid+,num=;
for(int i=l;i<=r;i++){
if(l1<=mid&&(r1>r||p[l1].y<p[r1].y)){
a[i]=p[l1++];
if(x0-d/<a[i].x)b[++num]=a[i];
}else{
a[i]=p[r1++];
if(a[i].x<x0+d/)b[++num]=a[i];
}
}
for(int i=l;i<=r;i++)p[i]=a[i]; for(int i=;i<=num;i++){
for(int j=i+;j<=num;j++){
if(b[j].y-b[i].y>=d/)break;
for(int k=j+;k<=num;k++){
if(b[k].y-b[j].y>=d/)break;
d=min(d,dis(i,j)+dis(j,k)+dis(k,i));
}
}
}
return d;
}
int main(){
int n=read();
for(int i=;i<=n;i++){
p[i].x=read();
p[i].y=read();
}
sort(p+,p+n+,cmp);
printf("%.6f\n",solve(,n));
return ;
}
BZOJ2458:[BJOI2011]最小三角形——题解的更多相关文章
- bzoj2458: [BeiJing2011]最小三角形(分治+几何)
题目链接:bzoj2458: [BeiJing2011]最小三角形 学习推荐博客:分治法编程问题之最接近点对问题的算法分析 题解:先将所有点按x值排列,然后每次将当前区间[l,r]分成左右两半递归求解 ...
- BZOJ2458 Beijing2011最小三角形(分治)
类似于平面最近点对,考虑分治,即分别计算分割线两侧的最小三角形再考虑跨过线的三角形. 复杂度证明也是类似的,对于某一个点,在另一侧可能与其构成最小三角形的点在一个d*d/2的矩形内(两边之和大于第三边 ...
- bzoj 2458: [BeiJing2011]最小三角形 题解
[前言]话说好久没有写题解了.到暑假了反而忙.o(╯□╰)o [原题] 2458: [BeiJing2011]最小三角形 Time Limit: 10 Sec Memory Limit: 128 M ...
- 分治 - 计算几何 - BZOJ2458,[BeiJing2011]最小三角形
http://www.lydsy.com/JudgeOnline/problem.php?id=2458 [BeiJing2011]最小三角形 描述 Frisk现在遇到了一个有趣的问题. 平面上有N个 ...
- [BZOJ2458][BeiJing2011]最小三角形(分治)
求平面上n个点组成的周长最小的三角形. 回忆平面最近点对的做法,找到横坐标的中点mid分治到两边,合并时考虑离mid横坐标不超过当前最小值d的所有点,按y排序后暴力更新答案. 这个题也一样,先分治到两 ...
- BZOJ2458: [BeiJing2011]最小三角形
类似分治最近点对的方法乱搞一下就行. #include<bits/stdc++.h> #define N 200010 #define M (s+t>>1) using nam ...
- bzoj-2458 2458: [BeiJing2011]最小三角形(计算几何+分治)
题目链接: 2458: [BeiJing2011]最小三角形 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1101 Solved: 380 Des ...
- BZOJ 2458 最小三角形 | 平面分治
BZOJ 2458 最小三角形 题面 一个平面上有很多点,求他们中的点组成的周长最小的三角形的周长. 题解 跟平面最近点对差不多,也是先把区间内的点按x坐标从中间分开,递归处理,然后再处理横跨中线的三 ...
- BZOJ 2458: [BeiJing2011]最小三角形 | 平面分治
题目: 给出若干个点 求三个点构成的周长最小的三角形的周长(我们认为共线的三点也算三角形) 题解: 可以参考平面最近点对的做法 只不过合并的时候改成枚举三个点更新周长最小值,其他的和最近点对大同小异 ...
随机推荐
- PS 去皱纹
1.打开一个有皱纹的图片,选择修复画笔工具,按住Alt键吸取一块光滑的皮肤,然后再在有皱纹的位置上点击即可
- H5应用程序缓存浅谈及实际测试
应用程序缓存能做什么? 可以在脱离网络的条件下离线访问. 减少读取服务器文件,减轻服务器的访问压力. 优化网站打开速度. 如何启用应用缓存? 第一步:给服务器添加新的MIME:扩展名:.appcach ...
- 树莓派怎么连接无线网wifi?
没有显示器的同学,想要连接无线网,一定非常苦恼,前面教会了大家远程登录图形界面,下面我将教会大家:在没有图形界面的情况下,怎么连接树莓派WiFi.同样还是利用putty远程访问软件登录,但这次不需要登 ...
- lintcode735. Replace With Greatest From Right
Given an array of integers, replace every element with the next greatest element (greatest element o ...
- 【转】VSstudio中的一些宏
说明 $(RemoteMachine) 设置为“调试”属性页上“远程计算机”属性的值.有关更多信息,请参见更改用于 C/C++ 调试配置的项目设置. $(References) 以分号分隔的引用列表被 ...
- 数据库Mysql的学习(七)-自定义函数和流程控制
DELIMITER // (设置结束符 其实我也不太明白为啥要这样 记住就行把) CREATE FUNCTION ym_date(mydate DATE) (创建函数 函数名字(参数)) ) (指定函 ...
- 关于Filter中ServletRequest强转HttpServletRequest问题
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOE ...
- 利用人脸特征提取DeepID--解读世纪晟人脸识别
概述:DeepID的目标是人脸验证(判断两张图片是否是一个人),同时衍生出人脸识别(多次人脸验证). DeepID采用增大数据集的方法: 增加新的数据,celebFaces(87628张图片,5436 ...
- opencv-学习笔记(1)常用函数和方法。
opencv-学习笔记(1)常用函数和方法. cv2.imread(filename,falg) filename是文件名字 flag是读入的方式 cv2.MREAD_UNCHANGED :不进行转化 ...
- centos+nginx+redmine+gitosis安装指南
说明 这篇文章我现在的主要目的是记录自己安装redmine和gitosis的过程,可能写的有些糙,请各位读者见谅.我会在后面的时间里逐渐完善细节.但我想,这已经是网上迄今为止国内最详细的nginx+r ...