【前言】话说好久没有写题解了。到暑假了反而忙。o(╯□╰)o

【原题】

2458: [BeiJing2011]最小三角形

Time Limit: 10 Sec  Memory Limit: 128 MB

Submit: 574  Solved: 177

[

id=2458" style="color:blue; text-decoration:none">Submit][Status]

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。

Source

【分析】今天新学了解决这类问题的方法——分治。

没错,就是分治。

先讲一下n是10^5级别的平面近期点对吧(CF 245 DIV 2 D)。非常easy懂。

具体的原理能够參考这个博客。讲的非常具体。

(非常多时候仅仅要感性认识原理就可以)以下讲一下具体做法。

①对于平面上的点。按x坐标排序(这是永久排序)。

②每次递归(l。r)。函数的返回值是第l个到第r个之间的全部点的近期点对。

③假设l=r。那么返回无穷大;假设l+1=r。就直接返回两个点的距离。

④每次先递归(l。mid)和(mid+1,r)。显然,这两个会有两个返回值。最好还是设为d1和d2。

首先我们设D=MIN(d1,d2)。即当前的最优值临时是D。

⑤显然,另一种情况。左边那块的某个点和右边那块的某个点产生关系。那么,我们能够从mid这个位置向左跑到mid-D,向右跑到mid+D,然后把这一段中的点都拎出来——由于仅仅有这两段中的点才有可能产生小于D的贡献。

⑥这时候我们要意识到潜在复杂度的保证(实际原理也不难懂呵)。

首先,假设直接枚举两两点要N^2。我们先把拎出来的点按y排序。

(NlogN)然后看似也是N^2的枚举,仅仅是加了一个优化(从底下開始枚举i。假设Y[J]-Y[I]>D就直接break)——这样可证明差点儿是线性。

总复杂度N*logN*logN。

再讲一下本题。也是几乎相同道理。

由于是三角形,我们把一些细节改一下就可以。

【代码】

#include<cstdio>
#include<cmath>
#include<algorithm>
#define N 200005
#define INF 210000000000.0
using namespace std;
struct arr{int x,y;}a[N],num[N];int n,i,Test;
inline bool cmpx(const arr &a,const arr &b){return a.x<b.x;}
inline bool cmpy(const arr &a,const arr &b){return a.y<b.y;}
inline double dis(const arr &a,const arr &b){return sqrt((a.x-b.x)*1.*(a.x-b.x)+(a.y-b.y)*1.*(a.y-b.y));}
inline double work(int l,int r)
{
if (l==r) return INF;
if (l+1==r) return INF;
if (l+2==r) return dis(a[l],a[l+1])+dis(a[l+1],a[r])+dis(a[l],a[r]);
int mid=(l+r)>>1;
double d1=work(l,mid),d2=work(mid+1,r);
double D=min(d1,d2),ans=D,DD=D/2.0;int cnt=0;
for (int i=l;i<=r;i++)
if (fabs(a[mid].x-a[i].x)<=DD) num[++cnt]=a[i];
sort(num+1,num+cnt+1,cmpy);
for (int i=1;i<cnt-1;i++)
for (int j=i+1;j<cnt;j++)
{
if (num[j].y-num[i].y>DD) break;
for (int k=j+1;k<=cnt;k++)
{
if (num[k].y-num[i].y>DD) break;
double temp=dis(num[i],num[j])+dis(num[i],num[k])+dis(num[j],num[k]);
if (temp<ans) ans=temp;
}
}
return ans;
}
int main()
{
read(n);//读入优化就不贴了。 for (i=1;i<=n;i++)
read(a[i].x),read(a[i].y);
sort(a+1,a+n+1,cmpx);
printf("%.6lf",work(1,n));
return 0;
}

bzoj 2458: [BeiJing2011]最小三角形 题解的更多相关文章

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

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

  2. [BZOJ]2458: [BeiJing2011]最小三角形

    题目大意:给出平面上n个点,求最小的由这些点组成的三角形的周长.(N<=200,000) 思路:点按x坐标排序后分治,每次取出与排在中间的点的横坐标相差不超当前答案一半的点,按y坐标排序后再暴力 ...

  3. BZOJ 2458: [BeiJing2011]最小三角形 (分治)

    分治就是了. 类似于分治找最近/远点对. CODE #include <bits/stdc++.h> using namespace std; const double eps = 1e- ...

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

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

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

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

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

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

  7. BZOJ2458:[BJOI2011]最小三角形——题解

    http://www.lydsy.com/JudgeOnline/problem.php?id=2458 Description Xaviera现在遇到了一个有趣的问题. 平面上有N个点,Xavier ...

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

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

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

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

随机推荐

  1. (2)oracle服务、建库

     一.oracle的服务 oracle 11g安装后服务一般是7到8个 1.Oracle ORCL VSS Writer Service Oracle卷映射拷贝写入服务(非必须启动) 2.Oracle ...

  2. 山东多校联合模拟赛 Day1

    矩形计数(rect) Description 给出圆周上的 \(N\) 个点,请你计算出以这些点中的任意四个为四个角,能构成多少个矩 形. 点的坐标是这样描述的,给定一个数组 \(v[1..N]\), ...

  3. 01背包【p1060】开心的金明

    Description 金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间他自己专用的很宽敞的房间.更让他高兴的是,妈妈昨天对他说:"你的房间需要购买哪些物品,怎么布置,你说了算,只要 ...

  4. 信息批量提取工具bulk-extractor

    信息批量提取工具bulk-extractor   在数字取证中,通常需要面对海量的数据,如几百GB甚至TB级别的数据.从这些海量数据中,提取有价值的数据是一个漫长.枯燥.繁琐的过程.Kali Linu ...

  5. http 头信息详解(转)

    HTTP(HyperTextTransferProtocol)是超文本传输协议的缩写,它用于传送WWW方式的数据,关于HTTP协议的详细内容请参考RFC2616.HTTP协议采用了请求/响应模型.客户 ...

  6. 重新认识被人遗忘的HTTP头注入

    前言 注入类漏洞经久不衰,多年保持在owasp Top 10的首位.今天就聊聊那些被人遗忘的http头注入.用简单的实际代码进行演示,让每个人更深刻的去认识该漏洞. HOST注入 在以往http1.0 ...

  7. GPU hang

    最近做新项目 初期一直遇到个gpu hang的问题 就是command 提交过去gpu 就一直在那里 直到time out 也没什么别的错误提示 gpu debugger还抓不了 解决方案是 缩小之后 ...

  8. Vue样式绑定和事件处理器

    一.样式绑定 class 与 style 是 HTML 元素的属性,用于设置元素的样式,我们可以用 v-bind 来设置样式属性. v-bind 在处理 class 和 style 时, 专门增强了它 ...

  9. Python 把u'\xca\xd3\xc6\xb5\xd7\xa5\xc8\xa1' 输出正常中文

    今天碰见从数据库读取出来数据是u'\xca\xd3\xc6\xb5\xd7\xa5\xc8\xa1',输出显示乱码,经常查询处理如下: 两种方式: 1. s = u'\xca\xd3\xc6\xb5\ ...

  10. POJ 2983-Is the Information Reliable?(差分约束系统)

    题目地址:POJ 2983 题意:有N个车站.给出一些点的精确信息和模糊信息.精确信息给出两点的位置和距离.模糊信息给出两点的位置.但距离大于等于一.试确定是否全部的信息满足条件. 思路:事实上就是让 ...