BZOJ 2458 最小三角形(分治)
题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=2458
题意:平面上有N个点,输出周长最小的三角形的周长。
思路:按照x升序。分治。然后就是合并。设两边分治得到的答案为C。那么对于在中间线两边的点到中线的x距离小于C。将这些点按照y升序。对于每个点,找到y坐标差也在C范围内的暴力一下就行。
struct point
{
double x,y;
void get()
{
RD(x,y);
}
double len()
{
return sqrt(x*x+y*y);
}
point operator-(point a)
{
point p;
p.x=x-a.x;
p.y=y-a.y;
return p;
}
};
point a[N];
int n;
double len(point p) {return p.len();}
int cmp1(point a,point b)
{
return a.x<b.x;
}
int cmp2(point a,point b)
{
return a.y<b.y;
}
double cal(int L,int R)
{
double ans=dinf;
int i,j,k;
for(i=L;i<=R;i++) for(j=i+1;j<=R;j++)
{
for(k=j+1;k<=R;k++)
{
upMin(ans,len(a[i]-a[j])+len(a[i]-a[k])+len(a[j]-a[k]));
}
}
return ans;
}
point b[N],c[N],Q[N];
int bNum,cNum;
int qNum;
double combine(double x,int M,int L,int R)
{
bNum=cNum=0;
int now=M;
while(a[M].x-a[--now].x<=x&&now>=L) b[++bNum]=a[now];
now=M;
while(a[++now].x-a[M].x<=x&&now<=R) c[++cNum]=a[now];
c[++cNum]=a[M];
sort(b+1,b+1+bNum,cmp2);
sort(c+1,c+1+cNum,cmp2);
double ans=dinf;
int q=1,p=1;
qNum=0;
int i,j,k;
FOR1(i,bNum)
{
while(q<=cNum&&b[i].y-c[q].y>x) q++;
p=q;
while(p<=cNum&&c[p].y-b[i].y<=x) Q[++qNum]=c[p++];
for(j=1;j<=qNum;j++) for(k=1;k<=j-1;k++)
{
upMin(ans,len(b[i]-Q[j])+len(Q[j]-Q[k])+len(b[i]-Q[k]));
}
qNum=0;
}
q=1;p=1;cNum=0;
now=M;
while(a[++now].x-a[M].x<=x&&now<=R) c[++cNum]=a[now];
b[++bNum]=a[M];
sort(b+1,b+1+bNum,cmp2);
sort(c+1,c+1+cNum,cmp2);
FOR1(i,cNum)
{
while(q<=bNum&&c[i].y-b[q].y>x) q++;
p=q;
while(p<=bNum&&b[p].y-c[i].y<=x) Q[++qNum]=b[p++];
for(j=1;j<=qNum;j++) for(k=1;k<=j-1;k++)
{
upMin(ans,len(c[i]-Q[j])+len(Q[j]-Q[k])+len(c[i]-Q[k]));
}
qNum=0;
}
return ans;
}
double DFS(int L,int R)
{
double ans;;
int M=(L+R)>>1;
if(R-L+1>5)
{
ans=min(DFS(L,M+1),DFS(M+1,R));
upMin(ans,combine(ans,M+1,L,R));
}
else ans=cal(L,R);
return ans;
}
int main()
{
RD(n);
int i;
FOR1(i,n) a[i].get();
sort(a+1,a+n+1,cmp1);
double ans=DFS(1,n);
PR(ans);
}
BZOJ 2458 最小三角形(分治)相关推荐
- 最小割分治(最小割树):BZOJ2229 BZOJ4519
定理:n个点的无向图的最小割最多n-1个. 可能从某种形式上形成了一棵树,不是很清楚. 最小割分治:先任选两个点求一边最小割,然后将两边分别递归,就能找到所有的最小割. 这两个题是一样的,直接搬din ...
- bzoj2458: [BeiJing2011]最小三角形
题目描述: $Xaviera$ 现在遇到了一个有趣的问题. 平面上有 $N$ 个点,$Xaviera$ 想找出周长最小的三角形. 由于点非常多,分布也非常乱,所以 $Xaviera$ 想请你来解决这个 ...
- [BZOJ2458][BeiJing2011]最小三角形
题目描述 Description Xaviera现在遇到了一个有趣的问题.平面上有N个点,Xaviera想找出周长最小的三角形.由于点非常多,分布也非常乱,所以Xaviera想请你来解决这个问题.为了 ...
- bzoj 1934 最小割
收获: 1.流量为0的边可以不加入. 2.最小割方案要与决策方案对应. 1 #include <cstdio> 2 #include <cmath> 3 #include &l ...
- BZOJ 1486 最小圈(二分+判负环)
题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1486 题意:给出一个有向图,边有权值.找到一个环,使得环上边的权值之和除以环上边的个数最 ...
- BZOJ 4285 使者 (CDQ分治+dfs序)
题目传送门 题目大意:给你一棵树,有三种操作,在两个点之间连一个传送门,拆毁一个已有的传送门,询问两个点之间的合法路径数量.一条合法路径满足 1.经过且仅经过一个传送门 2.不经过起点终点简单路径上的 ...
- 图的绝对中心(bzoj 2180: 最小直径生成树)
2180: 最小直径生成树 Time Limit: 10 Sec Memory Limit: 259 MB Submit: 219 Solved: 105 [Submit][Status][Dis ...
- 最小树形图(bzoj 4349: 最小树形图 2260: 商店购物)
最小树形图: 可以理解为对有向图求最小生成树,其中最小生成树的根为固定的某个点 朱-刘算法大致步骤: ①去掉所有重边 ②除了根之外对于每个点,只保留所有以它为终点的边中最短的一条,记bet[]为那条边 ...
- bzoj 4349: 最小树形图 朱-刘算法
最裸的最小树形图(←现在才学的弱渣). 显然只需要打一下一个堡垒,然后剩下的可以最后用最小的代价再打. 然后只要把图建出来跑一下朱-刘算法即可. 简单讲一下朱-刘算法吧(思想还是很简单的),下面只考虑 ...
最新文章
- centos 7 局域网丢包排查_Nginx搭建局域网yum源问题补充及解决思路与方法转发收藏...
- 曾因「抢车位」出圈儿,神奇的Mask R-CNN了解一下?
- redmine plugin
- es-head 删除INDEX 创建mapping
- 基于React-Native0.55.4的语音识别项目全栈方案
- 笔记:制作游戏所需的数学
- 计算机桌面不来回变黑,电脑屏幕变小了左右黑几种解决方法
- nginx+php-fpm页面显示空白的解决方法
- 分享一个自己写的基于TP的关系模型(2)
- 梁勇:展望 2017年商业智能BI 发展的趋势
- Java自学和培训的区别
- 光敏传感器实验报告_光敏电阻传感器实验报告
- 语音合成1700多个中文音频
- MySQL权限篇之SHOW DATABASES及SHOW VIEW
- adb root 权限运行
- 如何有效设计你的调查问卷?
- 如何以聪明的方式提问
- go语言复数包_Go语言圣经 2.3-复数
- Vertica—操作汇总
- ArcGIS JS之 4.23之IIS本地部署与问题解决
热门文章
- xmm1是什么器件_数字电路实验指导书
- 从根儿上理解mysql_从根儿上理解 MySQL - 页总结
- python win32模块详解_python模块:win32com用法详解
- 在 Postman 中报错:Self-signed SSL certificates are being blocked 的分析与解决
- GO语言-基础语法:循环
- linux桥接模式下配置静态ip
- (组合数学)AtCoder Grand Contest 019 F - Yes or No
- Cow Contest POJ - 3660
- url参数中有+、空格、=、%、、#等特殊符号的问题解决
- js中的target与currentTarget的区别转