分治入門 平面分治

2021-08-14 20:13:29 字數 1030 閱讀 1046

分治思想:劃分子問題,解決子問題,合併子問題

題目:uva 10245

題意:在乙個二維平面內給定n個點,求最近的兩個點的距離。(n≤10000)

題解:直接暴力列舉所有點是肯定行不通的。那麼基於分治的思想:按照橫座標排序後,分成兩個部分,那麼最近距離的點對就是以下的情況

(1)兩個點均屬於乙個區域

(2)兩個點屬於不同區域

對於(1)的情況,我們可以直接遞迴求得,因此關鍵在於對於第二情況的處理,直接處理的話並沒有比原來問題簡單多少。因此將(2)的描述修改一下

(·2)兩個點來自不同區域,並且橫座標距離<d(d為情況(1)的最小長度)

在(2)的基礎上加了橫座標距離<d的限制。因為在(1)之中我們已經找到了最短距離d,因此橫座標距離 ≥ d也就無需再考慮。

首先,所有的點已經以橫座標為關鍵字排序完成,取劃分界限mid,從mid往左列舉到mid的橫座標距離<d的點,再列舉mid往右邊走到mid的橫座標距離<d的點,對它們進行一一配對求得答案。就把整個平面縮成了[mid-d, mid+d],只需要考慮區間裡面的點即可。

這樣,遞迴的深度是o(logn),每層處理複雜度為o(n),而總的時間複雜度就是o(nlogn)

源**:

#include 

#include

#include

using

namespace

std;

const

int n = 1e4+5;

const

int inf = 0x3f3f3f3f;

struct node

a[n];

bool cmpx(node a, node b)

double solve(int l, int r)

int main()

return

0;}

分治入門 樹分治

分治思想 劃分子問題,解決子問題,合併子問題 題目 poj1741 題意 給定一棵含有n個節點的無向帶權樹,滿足距離 k的兩點共有多少對?n 1e4 題解 1 首先找到樹a的重心,重心指的是乙個節點,將該節點刪去之後剩下的最大子樹的節點數最小 將其作為樹a的根。在數列的分治之中我們是直接去區間的中間...

分治法求平面最近點對入門

一.平面最近點對問題.平面最近點對 在乙個平面上有n nn個點,求出距離最近的兩個點.平面最近點對是計算幾何中乙個十分經典且基礎的問題,通常採用分治法來解決.二.直線最近點對的分治法.在用分治法解決平面最近點對之前,我們用分治法來解決一下直線最近點對問題.考慮在一條直線上暴力列舉兩個點並計算距離取最...

UVA 10245 平面分治

一道平面分治的板子題 做之前剛學會平面分治,太菜了 把所有點按照x排序後,分成左半邊的最近距離和右半邊的最近距離,再以中點為圓心,目前的最近距離為半徑,做這個圓內的列舉,求最短距離。注意 sqrt 裡面的數如果是int型別會比double型別慢,如果次數多了會t 如下 1 include2 usin...