zoukankan      html  css  js  c++  java
  • 平面最近点对

    记录一下奇妙题目的奇妙做法。

    题意:给定二维平面上n个点的坐标,求最近点对距离,n<=2e5。

    解法:

    1. 分治:

      按x排序,取x中位数xm,以直线x=xm为分界线将所求问题分成两部分,分治求解两侧得到它们的ans。

      对于两侧所有离xm距离小于ans的点,分别按照y排序,然后一个左侧点在找另一个右侧点时只需考虑(Delta_y le ans)的即可。

      为了防止分界线上点过多,可以提前做个随机旋转。

      时间复杂度O(nlogn)。

    2. kdt:

      不会,貌似是kdt板子操作。

      虽然做这个大材小用但是kdt本身功能还是很强大的(啥时候学一下)。

    3. 随机贪心:

      运用人类智慧,随机旋转过后最近点对的(Delta_x)应该不会很大,按照x排序后只考虑前后5个。

      多旋几次求出解的概率还是很大的。

    4. k维分块:

      来自vuq的奇妙思路,本来是在讨论3维最近点对的,但显然适用于k维。

      考虑依次加入每个点后更新答案,显然我们只想去考虑离它很近的点,于是用以ans为半径的正方形将整个平面切成若干小块,这样我们只考虑它周围9个小块即可。

      如果加入某个点后ans被更新了,就O(n)重构。

      至于存储,显然不能存所有块,设计一个奇奇怪怪的(hash(frac{x_i}{ans},frac{y_i}{ans}))用hash_table存储即可。

      重构次数可能被卡到平方,不过我们对加入点对的顺序做个random_shuffle即可,那么加入第i个点时重构的概率约为(frac{i}{i^2}=frac{1}{i}),于是重构期望就变成了调和级数,即O(logn)。

    然后以上做法都可以扩展到k维。

  • 相关阅读:
    text-align: justify;浏览器、安卓手机不兼容问题
    sse 与 socket 摘录-推送常用技术
    mui longtap 事件无效
    对已有框架进行整理调用
    mui init 出现无法引入子页面问题
    mui页面交互
    js md5
    Ps大片教程:—失落之城
    用PS制作炫彩字教程
    如何将图片素材转为矢量图?
  • 原文地址:https://www.cnblogs.com/-SingerCoder/p/14851853.html
Copyright © 2011-2022 走看看