http://www.lydsy.com/JudgeOnline/problem.php?id=2458

Description

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

Input

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

Output

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

Sample Input

4
1 1
2 3
3 3
3 4

Sample Output

3.414214

HINT

100%的数据中N≤200000。

————————————————

哇作为练手平面分治的题我好高兴,一次A了。

不过最开始怀疑自己的思路有问题于是查了题解……然后发现竟然是对的。

额……

复述一下,和平面分治差不多,将solve函数的含义改为当前区间内最小三角形的周长。

然后我们发现对于一个三角形两点之间长度最大为d/2。

所以我们在归并排序y的时候把和中轴距离d/2的点捡出来。

然后三重循环枚举搞定(同时距离d/2不要忘了)

  1. #include<cmath>
  2. #include<cstdio>
  3. #include<cctype>
  4. #include<cstring>
  5. #include<iostream>
  6. #include<algorithm>
  7. using namespace std;
  8. typedef double dl;
  9. const dl INF=1e20;
  10. const int N=;
  11. inline int read(){
  12. int X=,w=; char ch=;
  13. while(!isdigit(ch)) {w|=ch=='-';ch=getchar();}
  14. while(isdigit(ch)) X=(X<<)+(X<<)+(ch^),ch=getchar();
  15. return w?-X:X;
  16. }
  17. struct node{
  18. dl x;
  19. dl y;
  20. }p[N],a[N],b[N];
  21. bool cmp(node A,node B){
  22. return A.x<B.x;
  23. }
  24. inline dl dis(int i,int j){
  25. return sqrt(pow(b[i].x-b[j].x,)+pow(b[i].y-b[j].y,));
  26. }
  27. dl solve(int l,int r){
  28. if(l>=r)return INF;
  29. int mid=(l+r)>>;
  30. dl x0=(p[mid].x+p[mid+].x)/2.0;
  31. dl d=min(solve(l,mid),solve(mid+,r));
  32. int l1=l,r1=mid+,num=;
  33. for(int i=l;i<=r;i++){
  34. if(l1<=mid&&(r1>r||p[l1].y<p[r1].y)){
  35. a[i]=p[l1++];
  36. if(x0-d/<a[i].x)b[++num]=a[i];
  37. }else{
  38. a[i]=p[r1++];
  39. if(a[i].x<x0+d/)b[++num]=a[i];
  40. }
  41. }
  42. for(int i=l;i<=r;i++)p[i]=a[i];
  43.  
  44. for(int i=;i<=num;i++){
  45. for(int j=i+;j<=num;j++){
  46. if(b[j].y-b[i].y>=d/)break;
  47. for(int k=j+;k<=num;k++){
  48. if(b[k].y-b[j].y>=d/)break;
  49. d=min(d,dis(i,j)+dis(j,k)+dis(k,i));
  50. }
  51. }
  52. }
  53. return d;
  54. }
  55. int main(){
  56. int n=read();
  57. for(int i=;i<=n;i++){
  58. p[i].x=read();
  59. p[i].y=read();
  60. }
  61. sort(p+,p+n+,cmp);
  62. printf("%.6f\n",solve(,n));
  63. return ;
  64. }

BZOJ2458:[BJOI2011]最小三角形——题解的更多相关文章

  1. bzoj2458: [BeiJing2011]最小三角形(分治+几何)

    题目链接:bzoj2458: [BeiJing2011]最小三角形 学习推荐博客:分治法编程问题之最接近点对问题的算法分析 题解:先将所有点按x值排列,然后每次将当前区间[l,r]分成左右两半递归求解 ...

  2. BZOJ2458 Beijing2011最小三角形(分治)

    类似于平面最近点对,考虑分治,即分别计算分割线两侧的最小三角形再考虑跨过线的三角形. 复杂度证明也是类似的,对于某一个点,在另一侧可能与其构成最小三角形的点在一个d*d/2的矩形内(两边之和大于第三边 ...

  3. bzoj 2458: [BeiJing2011]最小三角形 题解

    [前言]话说好久没有写题解了.到暑假了反而忙.o(╯□╰)o [原题] 2458: [BeiJing2011]最小三角形 Time Limit: 10 Sec  Memory Limit: 128 M ...

  4. 分治 - 计算几何 - BZOJ2458,[BeiJing2011]最小三角形

    http://www.lydsy.com/JudgeOnline/problem.php?id=2458 [BeiJing2011]最小三角形 描述 Frisk现在遇到了一个有趣的问题. 平面上有N个 ...

  5. [BZOJ2458][BeiJing2011]最小三角形(分治)

    求平面上n个点组成的周长最小的三角形. 回忆平面最近点对的做法,找到横坐标的中点mid分治到两边,合并时考虑离mid横坐标不超过当前最小值d的所有点,按y排序后暴力更新答案. 这个题也一样,先分治到两 ...

  6. BZOJ2458: [BeiJing2011]最小三角形

    类似分治最近点对的方法乱搞一下就行. #include<bits/stdc++.h> #define N 200010 #define M (s+t>>1) using nam ...

  7. bzoj-2458 2458: [BeiJing2011]最小三角形(计算几何+分治)

    题目链接: 2458: [BeiJing2011]最小三角形 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1101  Solved: 380 Des ...

  8. BZOJ 2458 最小三角形 | 平面分治

    BZOJ 2458 最小三角形 题面 一个平面上有很多点,求他们中的点组成的周长最小的三角形的周长. 题解 跟平面最近点对差不多,也是先把区间内的点按x坐标从中间分开,递归处理,然后再处理横跨中线的三 ...

  9. BZOJ 2458: [BeiJing2011]最小三角形 | 平面分治

    题目: 给出若干个点 求三个点构成的周长最小的三角形的周长(我们认为共线的三点也算三角形) 题解: 可以参考平面最近点对的做法 只不过合并的时候改成枚举三个点更新周长最小值,其他的和最近点对大同小异 ...

随机推荐

  1. TPO-12 C2 A problem of the TA's payroll

    TPO-12 C2 A problem of the TA's payroll payroll n. 工资单:在册职工人数:工资名单: paycheck n. 付薪水的支票,薪水 paperwork ...

  2. tpo-08 C2 A strategy for attracting customers

    第 1 段 1.Listen to a conversation between a student and a business professor. 听一段学生和教授的对话. 第 2 段 1.So ...

  3. Siki_Unity_1-8_使用Unity开发2D游戏_PongGame

    Unity 1-8 使用Unity开发2D游戏 PongGame 任务1:演示 http://pan.baidu.com/s/1pKUHsev; up2i 任务2:案例介绍 创建PongGame,注意 ...

  4. MongoDB->NoSQL(NoSQL = Not Only SQL ),意即"不仅仅是SQL"

    关系型数据库遵循ACID规则 事务在英文中是transaction,和现实世界中的交易很类似,它有如下四个特性: 1.A (Atomicity) 原子性 原子性很容易理解,也就是说事务里的所有操作要么 ...

  5. smartgit 使用

    合并分支

  6. 【MFC】学习与问题整合

    需要源码联系邮件:kangxlchn@163.com 1.新建一个MFC工程(基于对话框) 环境:vs2017 统统NEXT 新建完成后打开MFCPrj.cpp文件 打开类试图 每创建一个MFC项目, ...

  7. 上楼梯问题(递归C++)

    [问题描述] 小明上楼梯,一次可以迈1步,2步和3步,假设楼梯共有n个台阶,输出他所有的走法. [代码展示] #include<iostream>using namespace std;i ...

  8. 20145214 《Java程序设计》第2周学习总结

    20145214 <Java程序设计>第2周学习总结 教材学习内容总结 基本类型 整数:可分为short整数.int整数.long整数. 字节:即byte类型,可表示-128~127的整数 ...

  9. lintcode-148-颜色分类

    148-颜色分类 给定一个包含红,白,蓝且长度为 n 的数组,将数组元素进行分类使相同颜色的元素相邻,并按照红.白.蓝的顺序进行排序. 我们可以使用整数 0,1 和 2 分别代表红,白,蓝. 注意事项 ...

  10. TCP系列31—窗口管理&流控—5、TCP流控与滑窗

    一.TCP流控 之前我们介绍过TCP是基于窗口的流量控制,在TCP的发送端会维持一个发送窗口,我们假设发送窗口的大小为N比特,网络环回时延为RTT,那么在网络状况良好没有发生拥塞的情况下,发送端每个R ...