一、曼哈頓距離最小生成樹
曼哈頓距離最小生成樹問題可以簡述如下:
給定二維平面上的n個點,在兩點之間連邊的代價為其曼哈頓距離,求使所有點連通的最小代價。
樸素的演算法可以用o(n2)的prim,或者處理出所有邊做kruskal,但在這裡總邊數有o(n2)條,所以kruskal的複雜度變成了o(n2logn)。
但是事實上,真正有用的邊遠沒有o(n2)條。我們考慮每個點會和其他一些什麼樣的點連邊。可以得出這樣乙個結論,以乙個點為原點建立直角座標系,在每45度內只會向距離該點最近的乙個點連邊。
這個結論可以證明如下:假設我們以點a為原點建系,考慮在y軸向右45度區域內的任意兩點b(x1,y1)和c(x2,y2),不妨設|ab|≤|ac|(這裡的距離為曼哈頓距離),如下圖:
|ab|=x1+y1,|ac|=x2+y2,|bc|=|x1-x2|+|y1-y2|。而由於b和c都在y軸向右45度的區域內,有y-x>0且x>0。下面我們分情況討論:
1. x1>x2且y1>y2。這與|ab|≤|ac|矛盾;
2. x1≤x2且y1>y2。此時|bc|=x2-x1+y1-y2,|ac|-|bc|=x2+y2-x2+x1-y1+y2=x1-y1+2*y2。由前面各種關係可得y1>y2>x2>x1。假設|ac|2*y2+x1,那麼|ab|=x1+y1>2*x1+2*y2,|ac|=x2+y2<2*y2
3. x1>x2且y1≤y2。與2同理;
4. x1≤x2且y1≤y2。此時顯然有|ab|+|bc|=|ac|,即有|ac|>|bc|。
綜上有|ac|≥|bc|,也即在這個區域內只需選擇距離a最近的點向a連邊。
這種連邊方式可以保證邊數是o(n)的,那麼如果能高效處理出這些邊,就可以用kruskal在o(nlogn)的時間內解決問題。下面我們就考慮怎樣高效處理邊。
我們只需考慮在一塊區域內的點,其他區域內的點可以通過座標變換「移動」到這個區域內。為了方便處理,我們考慮在y軸向右45度的區域。在某個點a(x0,y0)的這個區域內的點b(x1,y1)滿足x1≥x0且y1-x1>y0-x0。這裡對於邊界我們只取一邊,但是操作中兩邊都取也無所謂。那麼|ab|=y1-y0+x1-x0=(x1+y1)-(x0+y0)。在a的區域內距離a最近的點也即滿足條件的點中x+y最小的點。因此我們可以將所有點按x座標排序,再按y-x離散,用線段樹或者樹狀陣列維護大於當前點的y-x的最小的x+y對應的點。時間複雜度o(nlogn)。
至於座標變換,乙個比較好處理的方法是第一次直接做;第二次沿直線y=x翻轉,即交換x和y座標;第三次沿直線x=0翻轉,即將x座標取相反數;第四次再沿直線y=x翻轉。注意只需要做4次,因為邊是雙向的。
至此,整個問題就可以在o(nlogn)的複雜度內解決了。
二、莫隊演算法
據說這個演算法是莫濤提出的(orz!),但是在網上到處都搜不到相關資料,最後問pty才知道的。這個演算法是用於處理一類不帶修改的區間查詢問題的離線演算法,其核心在於利用曼哈頓距離最小生成樹演算法對區間處理順序進行處理。比如下面這個例題(清橙a1206《小z的襪子》,就是莫隊出的題):
給定乙個長為n的序列,每個元素的值是其顏色。有m次詢問,每次詢問從乙個區間中隨機選取兩個元素同色的概率。
一次詢問[l,r]的答案即,其中是區間中第i中顏色的個數。顯然暴力是o(nm)的,而且一般的區間問題的思路似乎不適用。
我們先考慮乙個簡化的問題:所有的查詢區間的左端點都是1。那麼我們可以按右端點排序,假設已經處理出了[1,r]的答案,考慮轉移到[1,r+k],即新增k個元素,這個可以在o(k)的複雜度內求出。那麼處理所有區間的複雜度(不考慮排序)就是o(n)。
那麼如果是從[l,r]轉移到[l』,r』]呢?複雜度即o(|r』-r|+|l』-l|),也即點(l,r)到點(l』,r』)的曼哈頓距離。那麼如果將所有詢問轉化成二維平面中的點,求曼哈頓距離最小生成樹,再按照生成樹的順序做,就可以最小化區間之間轉移的複雜度。可以證明(我不會證……似乎莫隊的**裡有),這樣做的複雜度是o(n1.5)的。問題也就得到了解決。
曼哈頓距離最小生成樹
一 前人種樹 部落格 曼哈頓距離最小生成樹與莫隊演算法 部落格 學習總結 最小曼哈頓距離生成樹 二 知識梳理 曼哈頓距離 給定二維平面上的n個點,在兩點之間連邊的代價。即distance p1,p2 x1 x2 y1 y2 曼哈頓距離最小生成樹問題求什麼?求使所有點連通的最小代價。最小生成樹的 環切...
莫隊演算法(最小曼哈頓生成樹或者分塊處理)
莫隊演算法是一種離線處理區間問題很強的演算法,簡單學了下。例題 這題沒有地方提交,解答在犇犇部落格裡很清楚,反正就是分塊,然後按照l所在塊號,和右端點排序,離線搞 貼個kuangbin菊苣的 當莫隊的模版把 還有就是最小曼哈頓生成樹 這個就是把平面分成8塊,然後在45度裡求解,然後翻轉3次,就能求出...
關於曼哈頓距離下的最小生成樹
這些天一直在集訓,考了十幾次 zzy出了一道曼哈頓距離下的最小生成樹,考場上我沒做出來 嗯 這種題目的問題在於,你沒辦法把每兩個點都建一條邊 但是因為是曼哈頓距離,所以有一些特殊性質 容易證明,將某個點為原點建立笛卡爾座標系,將座標系分為每45 角為一塊的八個區域 那麼這個點向每個區域只會朝其中的某...