类似于平面最近点对,考虑分治,即分别计算分割线两侧的最小三角形再考虑跨过线的三角形。

  复杂度证明也是类似的,对于某一个点,在另一侧可能与其构成最小三角形的点在一个d*d/2的矩形内(两边之和大于第三边),并且这些点所组成的三角形周长均不小于d。然而并不清楚这里至多会有多少个点,vfk曾说上界是16,我当然不会证明这个上界也构造不出来有这么多点的方案。找这些点的时候归并就可以做到线性。那么复杂度是O(nlogn)乘上枚举这些点的常数2*16*15/2,看起来根本跑不动不过这个上界肯定是特别松的所以一点也不虚。

  算距离的时候会爆int。以及luogu数据疑似有锅。

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
int read()
{
int x=,f=;char c=getchar();
while (c<''||c>'') {if (c=='-') f=-;c=getchar();}
while (c>=''&&c<='') x=(x<<)+(x<<)+(c^),c=getchar();
return x*f;
}
#define N 200010
#define inf 1000000000
int n;
double ans=inf;
struct data
{
int x,y;
bool operator <(const data&a) const
{
return x<a.x||x==a.x&&y<a.y;
}
double operator -(const data&a) const
{
return sqrt(1ll*(x-a.x)*(x-a.x)+1ll*(y-a.y)*(y-a.y));
}
}a[N],b[N],c[N];
void getans(data *b,data *c,int n,int m)
{
int s=,t=;
for (int i=;i<=n;i++)
{
while (s<=m&&c[s].y+ans/<b[i].y) s++;
while (t<m&&c[t+].y-ans/<b[i].y) t++;
for (int j=s;j<t;j++)
{
double tot=b[i]-c[j];
for (int k=j+;k<=t;k++)
ans=min(ans,tot+(c[k]-b[i])+(c[k]-c[j]));
}
}
}
void solve(int l,int r)
{
if (l==r) return;
int mid=l+r>>;
solve(l,mid);
solve(mid+,r);
int n=,m=,MID=-inf;
for (int i=l;i<=mid;i++) MID=max(MID,a[i].x);
for (int i=l;i<=mid;i++)
if (*(MID-a[i].x)<ans) b[++n]=a[i];
for (int i=mid+;i<=r;i++)
if (*(a[i].x-MID)<ans) c[++m]=a[i];
getans(b,c,n,m);
getans(c,b,m,n);
int i=l,j=mid+;
for (int k=l;k<=r;k++)
if (j>r||i<=mid&&a[i].y<a[j].y) b[k]=a[i++];
else b[k]=a[j++];
for (int k=l;k<=r;k++) a[k]=b[k];
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("bzoj2458.in","r",stdin);
freopen("bzoj2458.out","w",stdout);
const char LL[]="%I64d\n";
#else
const char LL[]="%lld\n";
#endif
n=read();
for (int i=;i<=n;i++) a[i].x=read(),a[i].y=read();
sort(a+,a+n+);
solve(,n);
printf("%.6lf",ans);
return ;
}

BZOJ2458 Beijing2011最小三角形(分治)的更多相关文章

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. C#/JS AES字符串加密和解密

    往往我们有一种需求:在页面端实现对即将传入到后台端的某些字符串进行加密,然后在后台端对传入进来的字符串做解密.在一些有安全要求的数据传输上会用到此种方式 下面分别列出js端和后台端的加密或解密代码. ...

  2. Mysq性能分析 —— Genral log(普通日志)与 Slow log(慢速日式)

    对Mysql进行深入的分析对于发现mysql性能瓶颈和寻找优化策略是十分必要的. 我们可以从不同的粒度上对Mysql进行分析:可以整体分析服务器,或者检查单个查询或批查询.通过分析,我们得到的如下信息 ...

  3. 探讨CAN总线的抗干扰能力

    探讨CAN总线的抗干扰能力 CAN总线经近20年的发展已步入壮年期,它不仅在汽车领域的应用占据一定优势,在其他工业应用上也生机勃勃.枝繁叶茂.究竟是什么原因使它这么成功?当人们发现它的局限性,又面临新 ...

  4. 20155234 昝昕明 《网络对抗技术》实验一 PC平台逆向破解

    实践内容: 手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数. 利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,触发getShell函数. 注入一个自己制作的sh ...

  5. matplotlib 雷达图2

    说明 搞了一个最新版本的雷达图,比以前那个美观. 不多说,代码奉上: 完整代码 ''' matplotlib雷达图 ''' import numpy as np import matplotlib.p ...

  6. Ubuntu16.04上用源代码安装ICE

    ubuntu16.04上用源代码安装ICE

  7. Node总结 模块机制

    1. Node中的模块分为两类.一个是node提供的模块,称为核心模块,如http, fs, path:另一类是用户编写的模块,称为文件模块. 2. require()方法接收一个标识符进行模块查找. ...

  8. ElasticSearch入门 第四篇:使用C#添加和更新文档

    这是ElasticSearch 2.4 版本系列的第四篇: ElasticSearch入门 第一篇:Windows下安装ElasticSearch ElasticSearch入门 第二篇:集群配置 E ...

  9. 前端项目模块化的实践3:使用 TypeScript 的收益

    以下是关于前端项目模块化的实践,包含以下内容: 搭建 NPM 私有仓库管理源码及依赖: 使用 Webpack 打包基础设施代码: 使用 TypeScript 编写可靠类库 使用 TypeScript ...

  10. docker之compose 编排项目

    一.docker-compose 的介绍 docker-compose是一种容器编排工具,可以将多个docker容器关联部署.通过yaml文件,可以描述应用的架构,如使用什么镜像.数据卷.网络.绑定服 ...