洛谷P1257 平面上的最接近点对 数学 分治 排序

来自洛谷上的题解

方法一:

先求第1个点与其余n-1个点的距离;

再求第2个点与其余n-2个点的距离;

再求第3个点与其余n-3个点的距离;

…………………………………………

再求第n-1个点与其余1个点的距离;

然后找出最小值。

如此的算法复杂度为O(n^2),显然不能满足本题的需要。但……貌似洛谷神机可以……过……

欢迎朴素的同学挑战数据加强版新

方法二:

考虑以下分治算法:

设平面上的点都在点集S中,为了将S线性分割为大小大致相等的2个子集S1和S2,我们选取一垂直线l(方程:x=m)来作为分割直线。其中m为S中各点x坐标的中位数。由此将S分割为S1={p∈S|px≤m}和S2={p∈S|px>m}。从而使S1和S2分别位于直线l的左侧和右侧,且S=S1∪S2 。由于m是S中各点x坐标值的中位数,因此S1和S2中的点数大致相等。 递归地在S1和S2上解最接近点对问题,我们分别得到S1和S2中的最小距离δ1和δ2。现设δ=min (δ1,δ2)。

若S的最接近点对(p,q)之间的距离d(p,q)<δ则p和q必分属于S1和S2。不妨设p∈S1,q∈S2。那么p和q距直线l的距离均小于δ。因此,我们若用P1和P2分别表示直线l的左边和右边的宽为δ的2个垂直长条,则p∈S1,q∈S2

此时,P1中所有点与P2中所有点构成的点对均为最接近点对的候选者。在最坏情况下有n^2/4对这样的候选者。但是P1和P2中的点具有以下的稀疏性质,它使我们不必检查所有这n2/4对候选者。考虑P1中任意一点p,它若与P2中的点q构成最接近点对的候选者,则必有d(p,q)<δ。满足这个条件的P2中的点有多少个呢?容易看出这样的点一定落在一个δ×2δ的矩形R中,

由δ的意义可知P2中任何2个S中的点的距离都不小于δ。由此可以推出矩形R中最多只有6个S中的点。事实上,我们可以将矩形R的长为2δ的边3等分,将它的长为δ的边2等分,由此导出6个(δ/2)×(2δ/3)的矩形。

因此d(u,v)≤5δ/6<δ 。这与δ的意义相矛盾。也就是说矩形R中最多只有6个S中的点。由于这种稀疏性质,对于P1中任一点p,P2中最多只有6个点与它构成最接近点对的候选者。因此,在分治法的合并步骤中,我们最多只需要检查6×n/2=3n对候选者,而不是n^2/4对候选者。

我们只知道对于P1中每个S1中的点p最多只需要检查P2中的6个点,但是我们并不确切地知道要检查哪6个点。为了解决这个问题,我们可以将p和P2中所有S2的点投影到垂直线l上。由于能与p点一起构成最接近点对候选者的S2中点一定在矩形R中,所以它们在直线l上的投影点距p在l上投影点的距离小于δ。由上面的分析可知,这种投影点最多只有6个。因此,若将P1和P2中所有S的点按其y坐标排好序,则对P1中所有点p,对排好序的点列作一次扫描,就可以找出所有最接近点对的候选者,对P1中每一点最多只要检查P2中排好序的相继6个点。

至此,我们用分治法求出平面最接近点对。

其实这种方法我觉得应该是 nlogn^2 的

不过可以优化成nlogn ,但其实多只log 也没多大区别233

 1 type rec=record
 2      x,y:int64;
 3      end;
 4 var a:array [0..200001] of rec;
 5     tt,ttt,tttt:array [0..200001] of rec;
 6     n,l,m,min:int64;
 7     i,j,k:longint;
 8 procedure sort(l,r:longint);
 9 var i,j:longint;
10     x,y:rec;
11 begin
12   i:=l;
13   j:=r;
14   x:=a[(l+r) div 2];
15   repeat
16     while (a[i].x<x.x) or ((a[i].x=x.x) and (a[i].y>x.y)) do inc(i);
17     while (x.x<a[j].x) or ((x.x=a[j].x) and (x.y>a[j].y)) do dec(j);
18     if not(i>j)
19     then
20       begin
21         y:=a[i];
22         a[i]:=a[j];
23         a[j]:=y;
24         inc(i);
25         j:=j-1;
26       end;
27   until i>j;
28   if l<j then sort(l,j);
29   if i<r then sort(i,r);
30 end;
31 procedure sortt(l,r:longint);
32 var i,j:longint;
33     x,y:rec;
34 begin
35   i:=l;
36   j:=r;
37   x:=tttt[(l+r) div 2];
38   repeat
39     while (tttt[i].y<x.y) do inc(i);
40     while (x.y<tttt[j].y) do dec(j);
41     if not(i>j)
42     then
43       begin
44         y:=tttt[i];
45         tttt[i]:=tttt[j];
46         tttt[j]:=y;
47         inc(i);
48         j:=j-1;
49       end;
50   until i>j;
51   if l<j then sortt(l,j);
52   if i<r then sortt(i,r);
53 end;
54 function dis(a,b:rec):int64;
55 begin
56   exit(sqr(a.x-b.x)+sqr(a.y-b.y));
57 end;
58 function minn(a,b:int64):int64;
59 begin if a<b then exit(a) else exit(b); end;
60 function work(le,ri:longint):int64;
61 var tl,tr,t1,t2,min:int64;
62     i,j,k,lenr,lenl,p1,p2:longint;
63 begin
64   if ri-le=1 then exit(dis(a[ri],a[le]));
65   if ri-le=2 then exit(minn(minn(dis(a[ri],a[le]),dis(a[ri-1],a[le])),dis(a[le+1],a[ri])));
66   tl:=work(le,(le+ri) div 2);
67   tr:=work(((le+ri) div 2)+1,ri);
68   min:=minn(tl,tr);
69   t1:=(le+ri) div 2;
70   t2:=t1+1;
71   while (t1>=le) and (sqr(a[t1].x-a[(le+ri) div 2].x)<=min) do dec(t1);
72   inc(t1);
73   while (t2<=ri) and (sqr(a[t2].x-a[(le+ri) div 2].x)<=min) do inc(t2);
74   dec(t2);
75   if (t2=(le+ri) div 2) or (t1=((le+ri) div 2)+1) then exit(min);
76   for k:=t1 to t2 do tttt[k]:=a[k];
77   sortt(t1,t2);
78   for k:=t1 to t2-1 do
79     begin
80       for j:=k+1 to minn(k+8,t2) do
81         begin
82           min:=minn(min,dis(tttt[k],tttt[j]));
83         end;
84     end;
85   exit(min);
86 end;
87 begin
88   readln(n);
89   for i:=1 to n do readln(a[i].x,a[i].y);
90   sort(1,n);
91   writeln(sqrt(work(1,n)):0:4);
92 end.
时间: 2024-10-02 11:26:31

洛谷P1257 平面上的最接近点对 数学 分治 排序的相关文章

洛谷 P2800 又上锁妖塔

题目背景 小D在X星买完了想要的东西,在飞往下一个目的地的途中,正无聊的他转头看了看身边的小A,发现小A正在玩<仙剑> 题目描述 可是小A很奇怪,他一直在锁妖塔的周围转来转去,可是就是不进去,于是小D问他:”你在干什么?怎么不上去?”小A说:”我在想怎么从锁妖塔外面爬上去”(倒…) 锁妖塔的建造很特别,塔总共有n层,但是高度却不相同,这造成了小A爬过每层的时间也不同.小A会用仙术,每用一次可以让他向上跳一层或两层,但是每次跳跃后小A都将用完灵力,必须爬过至少一层才能再次跳跃(你可以认为小A需要

[洛谷 P2508] 圆上的整点

题目描述 求一个给定的圆(x^2+y^2=r^2),在圆周上有多少个点的坐标是整数. 输入输出格式 输入格式: r 输出格式: 整点个数 输入输出样例 输入样例#1: 4 输出样例#1: 4 说明 n<=2000 000 000 暴力很好打,但是这1000%是数论题.不就是推推式子嘛. 由于圆这个东西很棒棒,我们只需要考虑某一象限内的情况就行了.为了方便解题,我们取第一象限作研究对象. 因为x^2+y^2=n^2,变换一下,y^2=n^2-x^2=(n-x)(n+x). 设gcd(n-x,n+x

洛谷 P1952 火星上的加法运算_NOI导刊2009提高(3)

P1952 火星上的加法运算_NOI导刊2009提高(3) 题目描述 最近欢欢看到一本有关火星的书籍,其中她被一个加法运算所困惑,由于她的运算水平有限.她想向你求助,作为一位优秀的程序员,你当然不会拒绝. 输入输出格式 输入格式: 第一行先愉入一个运算的进制N(2<=N<=36),接下来两行为需要进行运算的字符,其中每个字符串的长度不超过200位,其为N进制的数.其中包括0-9及a-z(代表10-35). 输出格式: 在N进制下它们的和 输入输出样例 输入样例#1: 复制 20 1234567

洛谷.4172.[WC2006]水管局长(LCT Kruskal)

题目链接 洛谷(COGS上也有) 不想去做加强版了..(其实处理一下矩阵就好了) 题意: 有一张图,求一条x->y的路径,使得路径上最长边尽量短并输出它的长度.会有<=5000次删边. 这实际上就是动态地维护MST.用LCT维护MST,路径询问也能直接查询,每次删边看这条边是否在MST上. 只有1000个点!边直接矩阵存. 而且删边次数很少,于是最初想的是每次删边用堆优化Prim O(nlogn)重新求一遍MST.但是5000100010=5e7..(也许行吧) 日常删边改成加边,离线即可.加

洛谷P1195 口袋的天空 并查集

洛谷P1195 口袋的天空 并查集 将边从小到大排序,然后依次加边 看看是否能变成 K 个连通块,以及其最小话费 1 #include <cstdio> 2 #include <algorithm> 3 #define For(i,j,k) for(int i=j;i<=k;i++) 4 using namespace std ; 5 6 const int N = 1011,M = 10011,inf = 1e9 ; 7 struct edge{ 8 int x,y,val

洛谷P1774 最接近神的人_NOI导刊2010提高(02)(求逆序对)

To 洛谷.1774 最接近神的人 题目描述 破解了符文之语,小FF开启了通往地下的道路.当他走到最底层时,发现正前方有一扇巨石门,门上雕刻着一幅古代人进行某种活动的图案.而石门上方用古代文写着“神的殿堂”.小FF猜想里面应该就有王室的遗产了.但现在的问题是如何打开这扇门…… 仔细研究后,他发现门上的图案大概是说:古代人认为只有智者才是最容易接近神明的.而最聪明的人往往通过一种仪式选拔出来.仪式大概是指,即将隐退的智者为他的候选人写下一串无序的数字,并让他们进行一种操作,即交换序列中相邻的两个元

洛谷P1726 上白泽慧音

P1726 上白泽慧音 124通过 343提交 题目提供者yeszy 标签图论 难度提高+/省选- 提交该题 讨论 题解 记录 最新讨论 给两组数据吧! 题目描述 在幻想乡,上白泽慧音是以知识渊博闻名的老师.春雪异变导致人间之里的很多道路都被大雪堵塞,使有的学生不能顺利地到达慧音所在的村庄.因此慧音决定换一个能够聚集最多人数的村庄作为新的教学地点.人间之里由N个村庄(编号为1..N)和M条道路组成,道路分为两种一种为单向通行的,一种为双向通行的,分别用1和2来标记.如果存在由村庄A到达村庄B的通

BZOJ5291/洛谷P4458/LOJ#2512 [Bjoi2018]链上二次求和 线段树

原文链接http://www.cnblogs.com/zhouzhendong/p/9031130.html 题目传送门 - LOJ#2512 题目传送门 - 洛谷P4458 题目传送门 - BZOJ5291 推荐LOJ和洛谷,题面质量好,而且不卡常数. BZOJ题面烂,而且要卡那么一点点常数. 题意 有一条长度为$n$的链$\forall 1≤i<n$,点$i$与点$i+1$之间有一条边的无向图),每个点有一个整数权值,第$i$个点的权值是$a_i$??.现在有$m$个操作,每个操作如下: 操

[洛谷OJ] P1114 “非常男女”计划

洛谷1114 “非常男女”计划 本题地址:http://www.luogu.org/problem/show?pid=1114 题目描述 近来,初一年的XXX小朋友致力于研究班上同学的配对问题(别想太多,仅是舞伴),通过各种推理和实验,他掌握了大量的实战经验.例如,据他观察,身高相近的人似乎比较合得来. 万圣节来临之际,XXX准备在学校策划一次大型的“非常男女”配对活动.对于这次活动的参与者,XXX有自己独特的选择方式.他希望能选择男女人数相等且身高都很接近的一些人.这种选择方式实现起来很简单.