题目描述 Description

Xaviera现在遇到了一个有趣的问题。平面上有N个点,Xaviera想找出周长最小的三角形。由于点非常多,分布也非常乱,所以Xaviera想请你来解决这个问题。为了减小问题的难度,这里的三角形也包括共线的三点。

输入描述 Input Description

第一行包含一个整数N表示点的个数。接下来N行每行有两个整数,表示这个点的坐标。

输出描述 Output Description

输出只有一行,包含一个6位小数,为周长最短的三角形的周长(四舍五入)。

样例输入 Sample Input

4

1 1

2 3

3 3

3 4

样例输出 Sample Output

3.414214

数据范围及提示 Data Size & Hint

 

之前的一些废话:是时候准备会考了。。

题解:做法类似平面上求最近点对。首先把平面划分成两个部分,递归求出两个部分的答案为ans,然后,把离分割线距离小于ans/2的点全部加入队列,因为只有在这范围内答案才有可能比ans小,加入之后按照y坐标排一遍序,然后滑动窗口维护一下高度为ans/2的一个矩形,然后对矩形内的点暴力选,更新最优解即可。

代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
using namespace std;
typedef long long LL;
#define mem(a,b) memset(a,b,sizeof(a))
typedef pair<double,int> PDI;
const int maxn=200010;
const double oo=2147483647;
inline int read()
{int x=0,f=1;char c=getchar();while(!isdigit(c)){if(c=='-')f=-1;c=getchar();}while(isdigit(c)){x=x*10+c-'0';c=getchar();}return x*f;
}
struct Point
{double x,y;Point() {}Point(double _1,double _2):x(_1),y(_2){}bool operator < (const Point &s)const{if(x==s.x)return y<s.y;return x<s.x;}
}p[maxn];
int n;double x,y;
PDI s[maxn];
double dis(double a,double b,double c,double d){return sqrt((c-a)*(c-a)+(d-b)*(d-b));
}
double triangle_perimeter(double a,double b,double c,double d,double e,double f){return dis(a,b,c,d)+dis(a,b,e,f)+dis(c,d,e,f);
}
bool cmp(PDI a,PDI b){return a.first<b.first;}
double mdis(int l,int r)
{if(l+1>=r)return oo;if(l+2==r)return triangle_perimeter(p[l].x,p[l].y,p[l+1].x,p[l+1].y,p[r].x,p[r].y);int mid=(l+r)>>1,t=0;double d=min(mdis(l,mid),mdis(mid,r));for(int i=l;i<=r;i++)if(fabs(p[i].x-p[mid].x)<=d/2.0)s[t++]=make_pair(p[i].y,i); sort(s,s+t,cmp);int st=0,ed;while(st<=t-2){ed=st+1;while(fabs(s[ed].first-s[st].first)<=(d/2.0) && ed<=t-2)ed++;for(int i=st+1;i<ed;i++)for(int j=i+1;j<ed;j++)d=min(d,triangle_perimeter(p[s[st].second].x,p[s[st].second].y,p[s[i].second].x,p[s[i].second].y,p[s[j].second].x,p[s[j].second].y)); st++;}return d;
}
int main()
{n=read();for(int i=0;i<n;i++)x=(double)read(),y=(double)read(),p[i]=Point(x,y);sort(p,p+n);printf("%.6lf\n",mdis(0,n-1));return 0;
}

View Code

总结:滑动窗口好难写。

转载于:https://www.cnblogs.com/FYH-SSGSS/p/7061175.html

[BZOJ2458][BeiJing2011]最小三角形相关推荐

  1. bzoj2458: [BeiJing2011]最小三角形

    题目描述: $Xaviera$ 现在遇到了一个有趣的问题. 平面上有 $N$ 个点,$Xaviera$ 想找出周长最小的三角形. 由于点非常多,分布也非常乱,所以 $Xaviera$ 想请你来解决这个 ...

  2. BZOJ 2458 最小三角形(分治)

    题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=2458 题意:平面上有N个点,输出周长最小的三角形的周长. 思路:按照x升序.分治.然后就 ...

  3. bzoj 乱刷计划 50/50

    前言 话说第一个板刷计划由于种种原因而告一段落了..其实那一版还有很多题想做,那就只能放一放了 附上效果图一张(几乎每一题都在我博客有题解): 打算 可以复习,重做自己做过的题,不局限于没做过的 乱刷 ...

  4. L3-021 神坛(极角排序求三角形最小面积)

    在古老的迈瑞城,巍然屹立着 n 块神石.长老们商议,选取 3 块神石围成一个神坛.因为神坛的能量强度与它的面积成反比,因此神坛的面积越小越好.特殊地,如果有两块神石坐标相同,或者三块神石共线,神坛的面 ...

  5. 【CCCC】L3-021 神坛 (30分)计算几何+求三角形面积(极角排序)

    problem L3-021 神坛 (30分) 在古老的迈瑞城,巍然屹立着 n 块神石.长老们商议,选取 3 块神石围成一个神坛.因为神坛的能量强度与它的面积成反比,因此神坛的面积越小越好.特殊地,如 ...

  6. CCPC2019-湖南全国邀请赛(湘潭大学)

    Problem A Chessboard 补题地址:http://acm.hdu.edu.cn/showproblem.php?pid=6532 题意:有n个点,其价值为i:分别对某一行.某一列以下的 ...

  7. 星光 SaaS 伙伴甄云科技:如何构建更适合快成长企业的数字化采购管理平台?

    文章目录 前言 一.华为云助力中小企业快成长 二.SaaS 伙伴-甄云科技介绍 三.公司发展方向与要求的不匹配 3.1.快速成长型公司案例-戴尔 3.2.价值链和企业管理支撑不能匹配发展要求 四.支撑 ...

  8. 基于Problem Solving with Algorithms and Data Structures using Python的学习记录(4)——Recursion

    4.1.目标 本章的目标如下: 要理解可能难以解决的复杂问题有一个简单的递归解决方案. 学习如何递归地写出程序. 理解和应用递归的三个定律. 将递归理解为一种迭代形式. 实现问题的递归公式化. 了解计 ...

  9. 2019.8.7 金华正睿集训总结Day11(ACM)

    8.7 在这个欢乐的七夕佳节,我们迎来了欢乐的ACM 于是,在和yjz大佬和yy大佬严肃(?)讨论后,我们的队名就叫七夕"快乐"(为什么加引号就不说了,qq情头是和小号的某) 在前 ...

最新文章

  1. 有趣的计算机课的作文,有趣的电脑课作文500字
  2. 微信小游戏创业,究竟是红海还是死海?
  3. 一步一步学习C#(一)
  4. kubernetes性能测试实践
  5. [IE技巧] 如何禁止用户关闭IE浏览器
  6. 【CodeForces - 467C】George and Job(dp,思维)
  7. Oracle利用序列实现自动增长列
  8. visual studio 按钮判断管理员和用户_用户管理的设计原则
  9. cygwin 编译 android vlc,Cygwin 编译 VLC 问题
  10. 基于深度学习的手写数字识别、python实现
  11. 戴尔服务器板载系统raid管理,戴尔PowerEdge RAID控制卡使用示例(PERC H710P为例)
  12. 动态文本_(302期)【动态】|| 立足相同文本,描绘不同风景 ——工作室开展“同课异构”活动...
  13. Android自定义ProgressBar样式:渐变圆角水平进度条
  14. 计算机的kb和m之间的换算,g和兆的换算(G和M之间的换算)
  15. 什么是延时直播?自定义配置延时直播
  16. 浙师大 计算机科学技术导论,计算机科学技术导论
  17. 桌面上计算机程序包能删吗,桌面上的软件怎么删除教程【图文】
  18. 微信小程序关注公众号
  19. 一个26岁的男人和43岁的女人
  20. 入党申请书可以用计算机打印吗,入党申请书能用计算机打印吗?

热门文章

  1. android 揭示动画_遗传编程揭示具有相互作用的多元线性回归
  2. C语言高级编程:二级指针的赋值
  3. VS2008,GDIPlus初步
  4. keil中断函数的写法_在 KeilC里,中断子程序与函数有何不同?( )_学小易找答案
  5. umi权限路由_Umi 小白纪实(三)—— 震惊!路由竟然如此强大!
  6. 运行catia_教程 | CATIA宏的录制及应用
  7. mysql第四项_mysql数据库的基本介绍与操作(第四篇-mysql索引篇)
  8. python怎么创建一个二维数组_python 创建二维数组的方法
  9. PMP:4.项目整合管理
  10. size_t为什么重要