「LuoguP1429」 平面最近点对(加强版)

题目描述

给定平面上n个点,找出其中的一对点的距离,使得在这n个点的所有点对中,该距离为所有点对中最小的

输入输出格式

输入格式:

第一行:n;2≤n≤200000

接下来n行:每行两个实数:x y,表示一个点的行坐标和列坐标,中间用一个空格隔开。

输出格式:

仅一行,一个实数,表示最短距离,精确到小数点后面4位。

输入输出样例

输入样例#1:
复制

3
1 1
1 2
2 2

输出样例#1: 复制

1.0000

说明

0<=x,y<=10^9

题解

考场清晰的记得以前听过,并且记错做法还觉得自己是天才......

考场思路:按横轴排序,然后从左往右枚举每个点,把和该点的横坐标之差小于$ans$的点暴力算。

然后怕构造数据被卡(很多个点的横坐标差不多,竖轴差很多的话可以卡成$N$方),于是考虑用权值线段树优化竖轴,也就是从权值线段树中取竖轴在当前点加减ans范围的点暴力算。(考试$x,y$范围1e6)

这样应该就不会T了......

然后毒瘤评测人只给64M啊!哪里够开权值线段树啊!

于是把扫描线转了45°(也可以理解为把纸转45°),再做类暴力,这样就不好卡了。

然后就过了2333

 1 /*
 2     qwerta
 3     P1429 平面最近点对(加强版)
 4     Accepted
 5     100
 6     代码 C++,1.16KB
 7     提交时间 2018-10-19 15:55:35
 8     耗时/内存
 9     348ms, 2064KB
10 */
11 #include<algorithm>
12 #include<iostream>
13 #include<cstdio>
14 #include<cmath>
15 using namespace std;
16 #define R register
17 inline int read()
18 {
19     char ch=getchar();
20     int x=0;
21     while(!isdigit(ch))ch=getchar();
22     while(isdigit(ch)){x=x*10+ch-‘0‘;ch=getchar();}
23     return x;
24 }
25 const int MAXN=200000+3,MAXX=1000000+3;
26 struct emm{
27     int x,y;
28 }a[MAXN];
29 const double k=-0.5;
30 bool cmp(emm qaq,emm qwq)
31 {
32     return qaq.y-k*qaq.x<qwq.y-k*qwq.x;
33 }
34 inline double dis(int u,int v)
35 {
36     return sqrt(1LL*(a[u].x-a[v].x)*(a[u].x-a[v].x)+1LL*(a[u].y-a[v].y)*(a[u].y-a[v].y));
37 }
38 double gen2=sqrt(2);
39 inline double je(int u,int v)
40 {
41     return abs(((a[u].y-k*a[u].x)-(a[v].y-k*a[v].x)))/gen2;
42 }
43 int main()
44 {
45     //freopen("dark.in","r",stdin);
46     //freopen("dark.out","w",stdout);
47     int n=read();
48     for(R int i=1;i<=n;++i)
49       a[i].x=read(),a[i].y=read();
50     sort(a+1,a+n+1,cmp);
51     int l=1,r=1;
52     double ans=dis(1,2);
53     for(R int u=1;u<=n;++u)
54     {
55         while(je(u,l)>ans)++l;
56         while(je(r+1,u)<ans&&r<n)++r;
57         //cout<<u<<" "<<l<<" "<<r<<endl;
58         for(R int v=l;v<=r;++v)
59         if(u!=v)
60         ans=min(ans,dis(u,v));
61     }
62     printf("%.4f",ans);
63     return 0;
64 }

原文地址:https://www.cnblogs.com/qwerta/p/9819241.html

时间: 2024-11-07 20:17:21

「LuoguP1429」 平面最近点对(加强版)的相关文章

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

P1429 平面最近点对(加强版) 主要思路: 分治,将点按横坐标为第1关键字升序排列,纵坐标为第2关键字升序排列,进入左半边和右半边进行分治. 设d为左右半边的最小点对值.然后以mid这个点为中心,扩展宽为2d,长为2d的正方形.除了这个正方形外的点都不可能使答案更小.而且这个正方形里至多8个点(可以证明至多6个,我不会.but,知道至多8个就够了,这样已经保证了复杂度.)一句话证明:如果多余8个点,那么必有2个点的最小距离比d小.这8个点内暴力枚举就好了. //luoguP1429 #inc

Luogu P1429 平面最近点对(加强版)

P1429 平面最近点对(加强版) 题意 题目描述 给定平面上\(n\)个点,找出其中的一对点的距离,使得在这\(n\)个点的所有点对中,该距离为所有点对中最小的. 输入输出格式 输入格式: 第一行:\(n\):\(2\leq n\leq 200000\) 接下来\(n\)行:每行两个实数:\(x\ y\),表示一个点的行坐标和列坐标,中间用一个空格隔开. 输出格式: 仅一行,一个实数,表示最短距离,精确到小数点后面\(4\)位. 输入输出样例 输入样例#1: 3 1 1 1 2 2 2 输出样

如何优雅地「蜗居」?

如果我们把「蜗居」理解为小户型.小空间居住,包括合租.大开间等,如何才能让「蜗居」丝毫不尴尬,所谓「优雅」,就是排除客观限制,最大限度的提升居住品质. 王珦,室内设计师,文字编辑 蜗居要看“蜗”到了到什么程度,其实在帝都,有很多怀揣梦想的年轻人所住的“胶囊公寓”,就是在最极端的“蜗居”环境下被逼迫出的最朴素的空间解决方案.虽然看起来有点伤感,但其实这其中基本已经把紧凑型空间的利用方式与技巧揭示的七七八八了.当空间较为珍贵时,或利用效率非常重要时,能够展示活动性质与家具设备布置之间密切匹配关系的布

零元学Expression Design 4 - Chapter 7 使用内建功能「Clone」来达成Path的影分身之术

原文:零元学Expression Design 4 - Chapter 7 使用内建功能「Clone」来达成Path的影分身之术 本章所介绍的是便利且快速的内建工具Clone ? 本章所介绍的是便利且快速的内建工具Clone ? ? 为什麽会说像是影分身之术呢? ? 请参照火影忍者(NARUTO): <分身术>会分身术者,能以一身分出几身,几十身,乃至千百身. (此为鸣人的多重影分身之术的加强版--「後宫之术」) ? 看下去就知道 ? 01 首先,请先随意的在主要工作区画上你想要的图形 你可以

「Luogu4321」随机游走

「Luogu4321」随机游走 题目描述 有一张 \(n\) 个点 \(m\) 条边的无向图,\(Q\) 组询问,每次询问给出一个出发点和一个点集 \(S\) ,求从出发点出发随机游走走遍这个点集的期望步数. \(1 \leq n \leq 18, 1 \leq Q \leq 10^5\) 解题思路 : 听说是 \(\text{pkuwc2018d2t3}\) 加强版?但是原题时限是1s,各种卡不进去感觉一定要写 \(\text{Min-Max}\) 容斥,不过反正我今年听指导建议没报 \(\t

AC日记——「HNOI2017」单旋 LiBreOJ 2018

#2018. 「HNOI2017」单旋 思路: set+线段树: 代码: #include <bits/stdc++.h> using namespace std; #define maxn 100005 #define maxtree maxn<<2 int val[maxtree],tag[maxtree],L[maxtree],R[maxtree],mid[maxtree]; int op[maxn],ki[maxn],bi[maxn],cnt,size,n,ch[maxn]

「随笔」基于当下的思考

马德,说好的技术blog,变成日记本了... 下午的时候莫名其妙的感到很颓废,因为自己的不够强大感到忧虑和危机感十足.现在每每行走在技术的道路上,常觉得如履薄冰,如芒在背. 上大学之前和现在的心态其实差别挺大的,视野的开阔远远不止局限于自己的脚下.不过,这里的「上大学之前」只是一个时间描述词,并不觉得大学是最适合学习的地方,我很失望. 世界上的人无论性别,区域,宗教,兴趣爱好,总可以在互联网上找到志趣相同的人,总是可以不断打破自己的常识与惯性思维.总是有在相同领域比自己更强的人,挺好的. 关于知

hdu1007 平面最近点对(暴力+双线程优化)

突发奇想,用双线程似乎可以优化一些暴力 比如说平面最近点对这个题目,把点复制成2份 一份按照x排序,一份按照y排序 然后双线程暴力处理,一份处理x,一份处理y 如果数据利用x递减来卡,那么由于双线程,它卡不住y 如果数据利用y递减来卡,那么卡不住x 这样暴力n^2就可以过了 #include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <algori

平面最近点对(分治nlogn)

平面最近点对,是指给出平面上的n个点,寻找点对间的最小距离 首先可以对按照x为第一关键字排序,然后每次按照x进行分治,左边求出一个最短距离d1,右边也求出一个最短距离d2,那么取d=min(d1, d2) 然后只需考虑横跨左右两侧的点,不妨枚举左侧的点pi 那么很显然的是如果pi距离中间的点超过了d,便可以直接舍去,只需考虑距离中间点小于d的点 这样一来就可以对每个pi画一个边长为2d的正方形,易证,矩形内最多存在8个点. 那么关键问题就是要快速找这8个点 朴素做法是对分治后的点进行快排,这样复