P1429-平面最近点对(加强版)【分治】

正题

题目链接:https://www.luogu.com.cn/problem/P1429


题目大意

平面上nnn个点,求最近点对


解题思路

考虑分治求最近点对,首先将平行于yyy轴将平面穿过xxx左边的中位数分割成两半,现在最近点对有三种可能,

  1. 在分割线左边
  2. 在分割线右边
  3. 穿过分割线

我们知道1和2可以用分治到两边计算,考虑如何求情况3。暴力枚举对数肯定会TLETLETLE,考虑优化,假设我们已经知道1和2的最小解d1,d2d1,d2d1,d2了,我们有d=min{d1,d2}d=min\{d1,d2\}d=min{d1,d2},那么我们可以以分割线为对称轴做一个2d∗d2d*d2dd的矩形,最近点对的两个点一定在这个矩形内。

这样计算为什么可以优化算法?因为矩阵内的点数是常数级别的,首先我们可以由分割线分割成两个小正方形,我们知道正方形内的点距离一定不小于ddd,那么一个正方形内最多只有常数级别的点数(好像是3个的样子)

所以时间复杂度O(nlog⁡n)O(n\log n)O(nlogn)


codecodecode

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
const int N=2e5+10;
int n,p[N],c[N];
double x[N],y[N];
bool cmp(int a,int b)
{return (x[a]==x[b])?(y[a]<y[b]):(x[a]<x[b]);}
bool cMp(int a,int b)
{return y[a]<y[b];}
double get_dis(int a,int b)
{return sqrt((x[a]-x[b])*(x[a]-x[b])+(y[a]-y[b])*(y[a]-y[b]));}
double Solve(int l,int r){double d=1e18;if(l==r)return d;if(l+1==r)return get_dis(p[l],p[r]);int mid=(l+r)>>1;double d1=Solve(l,mid);double d2=Solve(mid+1,r);d=min(d1,d2);int tot=0;for(int i=l;i<=r;i++)if(fabs(x[p[i]]-x[p[mid]])<=d)c[++tot]=p[i];sort(c+1,c+1+tot,cMp);for(int i=0;i<tot;i++){for(int j=i+1;j<=tot;j++){if(y[c[j]]-y[c[i]]>=d)break;double D=get_dis(c[i],c[j]);d=min(d,D);}}return d;
}
int main()
{scanf("%d",&n);for(int i=1;i<=n;i++){scanf("%lf%lf",&x[i],&y[i]);p[i]=i;}sort(p+1,p+1+n,cmp);printf("%.4lf",Solve(1,n));
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/321313.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

夏季(8 ~9)月 在深圳举办线下dotnet 大会 调查

随着微软 Build 2018的落幕&#xff0c;微软为.NET Core的应用规划了七大场景&#xff1a;计划今年夏季&#xff08;8 ~9&#xff09;月 在深圳举办线下dotnet 大会 &#xff0c;特此向大家做个调查。请大家抽出5分钟做下投票&#xff1a;顺便送大家一个福利&#xff1a;.NET社…

2019.01.22【NOIP普及组】模拟赛C组总结

总结 这次模拟赛拿到了10010010060360的分数 第1,2题不怎么难&#xff0c;快速解决&#xff0c;第3题看到之后马上想到了混合背包&#xff0c;打了大概半小时解决了&#xff0c;最后一道题想来想去&#xff0c;想了一堆没用的东西&#xff0c;最后打了一个垃圾DP拿了60分&…

codeforces 938E MaxHistory 组合数学

题意 给出一个长为n的序列&#xff0c;对于这个序列的任意一个排列&#xff0c;求∑fa\sum f_a∑fa​的值。 题解 我们枚举每一个aia_iai​然后&#xff0c;计算aia_iai​出现了多少次&#xff0c;然后把ai∗numa_i*numai​∗num加入到ans里面。 考虑aia_iai​什么时候出现。 a…

.NET 图形化开源爬虫Hawk 3发布

超级图形化爬虫Hawk已经发布两年半时间了&#xff0c;2015年升级到第二版&#xff0c;收到上千条用户反馈(tucao)&#xff0c;100多个红包&#xff0c;总共666块五毛~一直想攒着这笔钱&#xff0c;去北境之王天通苑的龙德商场买最心爱的阿迪王&#xff01;啥&#xff0c;你不知…

P4027-[NOI2007]货币兑换【斜率优化dp,CDQ分治】

正题 题目链接:https://www.luogu.com.cn/problem/P4027 题目大意 nnn天开始时有SSS元钱&#xff0c;每天AAA种股票价格为aia_iai​,BBB种价格为bib_ibi​。然后出售必须AAA和BBB出售相同比例&#xff0c;买入时AAA和BBB必须按照rir_iri​的比例买入。 求最后的钱最多是多少 …

【栈】【字符】匹配(jzoj 1612)

匹配 题目大意&#xff1a; 给你一个长度为n的字符串&#xff08;有多组数据&#xff09;&#xff0c;中间有小写字母&#xff08;没用的东西&#xff09;和大写字母&#xff0c;A-M是左括号&#xff0c;与之相对的是右括号Z-N&#xff08;之所以说是Z-N而不是N-Z是因为只有Z…

codeforces 940E Cashback 有趣的dp

题解 这么明显的一个dp&#xff0c;我怎么就没看出来呢&#xff1f;&#xff01; 首先我们需要一些前提条件&#xff1a;任何划分出来的一个区间的长度不应该超过c。 如果这个区间长度大于c&#xff0c;那么设lenn∗cklenn∗ck&#xff0c;那么这个区间应该被分成n个长度为c的…

理解 C# 项目 csproj 文件格式的本质和编译流程

写了这么多个 C# 项目&#xff0c;是否对项目文件 csproj 有一些了解呢&#xff1f;Visual Studio 是怎么让 csproj 中的内容正确显示出来的呢&#xff1f;更深入的&#xff0c;我能够自己扩展 csproj 的功能吗&#xff1f;本文将直接从 csproj 文件格式的本质来看以上这些问题…

P2000-拯救世界【生成函数,NTT】

正题 题目链接:https://www.luogu.com.cn/problem/P2000 题目大意 十种东西&#xff0c;有要求 金神石A的块数必须是 6 的倍数。 木神石A最多用 9 块。 水神石A最多用 5 块。 火神石A的块数必须是 4 的倍数。 土神石A最多用 7 块。 金神石B的块数必须是 2 的倍数。 木神石B最…

【模拟】生日蛋糕(jzoj 1613)

生日蛋糕 题目大意&#xff1a; 一个正方形蛋糕&#xff0c;竖着横着各切一刀&#xff0c;使他变成四块正方形蛋糕&#xff0c;蛋糕中有一些巧克力&#xff0c;而小明只能拿巧克力最少的一块&#xff0c;请问小明要怎么切才能吃到最多的巧克力 样例输入 8 …#…#… .##……

使用.NET Core与Google Optimization Tools实现加工车间任务规划

前一篇文章《使用.NET Core与Google Optimization Tools实现员工排班计划Scheduling》算是一种针对内容的规划&#xff0c;而针对时间顺序任务规划&#xff0c;加工车间的工活儿是一个典型的场景。在加工车间有不同的工活儿&#xff0c;一般称为作业&#xff0c;每种作业都有多…

P6047-丝之割【斜率优化,dp】

前言 然而丝之鸽还是没有出 正题 题目链接:https://www.luogu.com.cn/problem/P6047 题目大意 两个平行的线&#xff0c;上面连接着若干条弦&#xff0c;第iii条连接上方的xix_ixi​个下方的yiy_iyi​。 然后每次可以选择一个位置(i,j)(i,j)(i,j)&#xff0c;可以切断任何位…

洛谷P1373 小a和uim之大逃离 动态规划

题解 我们可以先简单的想一种状态&#xff0c;也就是dp[i][j][x][y][t]dp[i][j][x][y][t]dp[i][j][x][y][t]&#xff0c;这是最暴力的。 当t0t 0t0时&#xff0c;表示小a处于(i,j)(i,j)(i,j)位置&#xff0c;其中小a拥有x魔液&#xff0c;uim拥有y的魔液时候的方案总数。t1t …

【模拟】游戏(jzoj 1614)

游戏 题目大意&#xff1a; 有一个n*n的棋盘&#xff0c;有一个坐标在x,y的棋子&#xff0c; 1、2号玩家可以将他向左&#xff0c;向下&#xff0c;向左下&#xff08;45∘45^{\circ}45∘&#xff09;移动若干格&#xff0c;假如他们都是AKIOI聪明绝顶的巨佬&#xff0c;请问…

VSTS + XX云服务器构建netcore+docker持续集成交付部署

持续集成交付部署是什么意思,它给我们带来什么好处&#xff1f;先贴一张图持续集成&#xff08;Continuous Integration&#xff09;持续集成强调开发人员提交了新代码之后&#xff0c;立刻进行构建、&#xff08;单元&#xff09;测试(这个要看情况了是否需要)持续交付&#x…

codeforces E. Game with String 概率

题意 这道题目的叙述不好理解&#xff1a; 给你一个字符串ss,小a和小b都知道。现在小b要把字符串的左边一段移动到最右边,生成一个新的字符串s&#x2032;" role="presentation" style="position: relative;">s′s′&#xff0c;小a只知道s′…

P4593-[TJOI2018]教科书般的亵渎【拉格朗日差值】

正题 题目链接:https://www.luogu.com.cn/problem/P4593 题目大意 场上有若干只怪&#xff0c;最高的为nnn&#xff0c;每个怪血量不同&#xff0c;有mmm个血量不存在。 不停释放亵渎&#xff08;全场打一&#xff0c;如果有怪死亡就再次生效&#xff09;&#xff0c;每次一…

【链表】【树形DP】最大利润(jzoj 1487)

最大利润 题目大意&#xff1a; 有n个车站&#xff0c;每个车站有一定的人数&#xff0c;有n-1条线路连接着这些车站&#xff0c;相邻的车站不能同时有两个餐厅&#xff0c;当在一个车站建立餐厅时&#xff0c;会得到这个车站所有人的monny&#xff08;1个人可以得到1份利润&…

P2617-Dynamic Rankings【树套树】

正题 题目链接:https://www.luogu.com.cn/problem/P2617 题目大意 给出一个序列&#xff0c;要求支持 区间查询第kkk大单点修改 解题思路 区间查询第kkk大需要使用主席树&#xff0c;构建权值线段树的前缀和。考虑如何进行单点修改&#xff0c;在前缀和上进行单点修改就是进…

如何创建一个基于 MSBuild Task 的跨平台的 NuGet 工具包

MSBuild 的 Task 为我们扩展项目的编译过程提供了强大的扩展性&#xff0c;它使得我们可以用 C# 语言编写扩展&#xff1b;利用这种扩展性&#xff0c;我们可以为我们的项目定制一部分的编译细节。NuGet 为我们提供了一种自动导入 .props 和 .targets 的方法&#xff0c;同时还…