分治思想:劃分子問題,解決子問題,合併子問題
題目: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...