bzoj2458 最小三角形
Description
Xaviera现在遇到了一个有趣的问题。
平面上有N个点,Xaviera想找出周长最小的三角形。
由于点非常多,分布也非常乱,所以Xaviera想请你来解决这个问题。
为了减小问题的难度,这里的三角形也包括共线的三点。
Input
第一行包含一个整数N表示点的个数。
接下来N行每行有两个整数,表示这个点的坐标。
Output
输出只有一行,包含一个6位小数,为周长最短的三角形的周长(四舍五入)。
#include<cstdio>
#include<algorithm>
#include<cmath>
double ans=1.0e16;
int w=;
struct pos{
double x[];
}ps[];
bool operator<(const pos &a,const pos &b){
return a.x[w]<b.x[w];
}
double dist(pos &a,pos &b){
double x=a.x[]-b.x[],y=a.x[]-b.x[];
return sqrt(x*x+y*y);
}
void f(int _w,int l,int r){
if(l+>r){
for(int i=l;i<r;i++)
for(int j=i+;j<r;j++)
for(int k=j+;k<=r;k++){
double v=dist(ps[i],ps[j])+dist(ps[i],ps[k])+dist(ps[j],ps[k]);
if(v<ans)ans=v;
}
return;
}
w=_w;
std::sort(ps+l,ps+r+);
int m=l+r>>;
f(_w^,l,m);
f(_w^,m+,r);
w=_w;
std::sort(ps+l,ps+m+);
std::sort(ps+m+,ps+r+);
int p1=m,p2=m+;
int a=ans*0.5+,x1=ps[m].x[_w],x2=ps[m+].x[_w];
while(p1>l&&ps[p1-].x[_w]+a>=x1)--p1;
while(p2<r&&ps[p2+].x[_w]-a<=x2)++p2;
w^=;
std::sort(ps+p1,ps+m+);
std::sort(ps+m+,ps+p2+);
for(int i=p1;i<=m;i++){
int p3=m+,p4=p2;
while(p3<p2&&ps[p3+].x[w]+a<ps[i].x[w])++p3;
while(p4>m+&&ps[p4-].x[w]-a>ps[i].x[w])--p4;
for(int j=p3;j<p4;j++)
for(int k=j+;k<=p4;k++){
double v=dist(ps[i],ps[j])+dist(ps[i],ps[k])+dist(ps[j],ps[k]);
if(v<ans)ans=v;
}
}
for(int i=m+;i<=p2;i++){
int p3=p1,p4=m;
while(p3<p2&&ps[p3+].x[w]+a<ps[i].x[w])++p3;
while(p4>m+&&ps[p4-].x[w]-a>ps[i].x[w])--p4;
for(int j=p3;j<p4;j++)
for(int k=j+;k<=p4;k++){
double v=dist(ps[i],ps[j])+dist(ps[i],ps[k])+dist(ps[j],ps[k]);
if(v<ans)ans=v;
}
}
}
int n;
int main(){
scanf("%d",&n);
for(int i=;i<n;i++)scanf("%lf%lf",&ps[i].x[],&ps[i].x[]);
double c=cos(0.8),s=sin(0.8);
for(int i=;i<n;i++){
double x=ps[i].x[],y=ps[i].x[];
ps[i].x[]=c*x+s*y;
ps[i].x[]=-s*x+c*y;
}
f(,,n-);
printf("%.6lf",ans);
return ;
}
bzoj2458 最小三角形的更多相关文章
- bzoj2458: [BeiJing2011]最小三角形(分治+几何)
题目链接:bzoj2458: [BeiJing2011]最小三角形 学习推荐博客:分治法编程问题之最接近点对问题的算法分析 题解:先将所有点按x值排列,然后每次将当前区间[l,r]分成左右两半递归求解 ...
- BZOJ2458 Beijing2011最小三角形(分治)
类似于平面最近点对,考虑分治,即分别计算分割线两侧的最小三角形再考虑跨过线的三角形. 复杂度证明也是类似的,对于某一个点,在另一侧可能与其构成最小三角形的点在一个d*d/2的矩形内(两边之和大于第三边 ...
- BZOJ2458:[BJOI2011]最小三角形——题解
http://www.lydsy.com/JudgeOnline/problem.php?id=2458 Description Xaviera现在遇到了一个有趣的问题. 平面上有N个点,Xavier ...
- bzoj-2458 2458: [BeiJing2011]最小三角形(计算几何+分治)
题目链接: 2458: [BeiJing2011]最小三角形 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1101 Solved: 380 Des ...
- 分治 - 计算几何 - BZOJ2458,[BeiJing2011]最小三角形
http://www.lydsy.com/JudgeOnline/problem.php?id=2458 [BeiJing2011]最小三角形 描述 Frisk现在遇到了一个有趣的问题. 平面上有N个 ...
- [BJWC2011]最小三角形(分治+最近点对)
题面:BJWC2011 最小三角形 \(solution:\) 昨天才学完平面最近点对,今天就要求平面最近的三个点,显然不是巧合. 仔细一思考,我们用来求平面最近点对的方法不就可以用到三个点上吗? 就 ...
- BZOJ 2458 最小三角形 | 平面分治
BZOJ 2458 最小三角形 题面 一个平面上有很多点,求他们中的点组成的周长最小的三角形的周长. 题解 跟平面最近点对差不多,也是先把区间内的点按x坐标从中间分开,递归处理,然后再处理横跨中线的三 ...
- bzoj 2458: [BeiJing2011]最小三角形 题解
[前言]话说好久没有写题解了.到暑假了反而忙.o(╯□╰)o [原题] 2458: [BeiJing2011]最小三角形 Time Limit: 10 Sec Memory Limit: 128 M ...
- [BZOJ2458][BeiJing2011]最小三角形(分治)
求平面上n个点组成的周长最小的三角形. 回忆平面最近点对的做法,找到横坐标的中点mid分治到两边,合并时考虑离mid横坐标不超过当前最小值d的所有点,按y排序后暴力更新答案. 这个题也一样,先分治到两 ...
随机推荐
- 给Ajax一个漂亮的嫁衣——Ajax系列之五(下)之序列化和反序列化
给Ajax一个漂亮的嫁衣——Ajax系列之五(下)之序列化和反序列化 标签: ajaxdictionaryjsonobject服务器function 2012-07-25 18:41 2242人阅读 ...
- Oracle 备份与恢复 15 个典型问题
1.问:Oracle11g数据库数据量有50T,每天增量50g左右,该如何制定备份方案,如何验证备份的有效性? 答:50T的数据也不大,运营商的地市级市数据基本都在100T以上了,只要备份环境允许的话 ...
- ACdream 1067:Triangles
Problem Description 已知一个圆的圆周被N个点分成了N段等长圆弧,求任意取三个点,组成锐角三角形的个数. Input 多组数据,每组数据一个N(N <= 1000000) Ou ...
- MyEclipse移动开发教程:设置所需配置的iOS应用(三)
MyEclipse个人授权 折扣低至冰点!立即开抢>> [MyEclipse最新版下载] 三.创建配置文件 Provisioning profiles授权文件应用程序在iOS设备上安装并运 ...
- svn断开重连,避免重建工作空间
1. 右键项目-->Team-->断开连接 2.选择从文件系统中删除SVN元信息 3.右键项目-->Team-->share project-->svn 4.创建新的资源 ...
- php 文件上传处理
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAS4AAACvCAIAAADMuaTdAAAcaklEQVR4nO2da3Abx33Az3H6JdNx2i
- Ubuntu使用Remastersys封装制作系统ISO镜像
首先下载Remastersys的Deb软件包 链接:http://pan.baidu.com/s/1i3tYPKT 密码:qvyd 使用命令强制安装 dpkg --force-all -i remas ...
- windows server 账号克隆
在dos命令行下隐藏用户的方法: net user 账户 密码 /add 如果在账号后加 $ 符号 这个账户在cmd命令行下是无法看见的 首先我们设置注册表权限 cmd = > regedt ...
- opencv-python教程学习系列13-图像平滑
前言 opencv-python教程学习系列记录学习python-opencv过程的点滴,本文主要介绍图像平滑,坚持学习,共同进步. 系列教程参照OpenCV-Python中文教程: 系统环境 系统: ...
- 工具运行过程中,CPU占用过高的分析定位
之前使用Java Swing开发了一款设备档案收集工具.支持多台设备同时收集,每个设备使用一个线程.在同时收集多台设备信息时,发现CPU占用率居然达到了97%,而且高居不下.显然这样的性能是令人无法忍 ...