51nod 1213 二維曼哈頓距離最小生成樹

2022-04-27 11:15:09 字數 1742 閱讀 4627

1213 二維曼哈頓距離最小生成樹

基準時間限制:4 秒 空間限制:131072 kb 分值: 160 難度:6級演算法題

收藏關注二維平面上有n個座標為整數的點,點x1 y1同點x2 y2之間的距離為:橫縱座標的差的絕對值之和,即:abs(x1 - x2) + abs(y1 - y2)(也稱曼哈頓距離)。求這n個點所組成的完全圖的最小生成樹的邊權之和。

input

第1行:1個數n,表示點的數量。(2 <= n <= 50000)

第2 - n + 1行:每行2個數,表示點的座標(0 <= x, y <= 1000000)

output

輸出n個點所組成的完全圖的最小生成樹的邊權之和。
input示例

3

0 01 0

1 1

output示例

2

所以我們只要求乙個點在其45°角的區域內離他最近的點就行了,而這可以用線段樹或樹狀陣列解決

我們以y軸正半軸往右偏45°角的區域為例:

點j在點i的這個區域要滿足的條件是:

yj-xj>yi-xi

且xj>xi

那麼我們將點以x為第一關鍵字,y為第二關鍵字,排序後倒序插入線段樹

線段樹的線段這一維是離散後的y-x,值是y+x

我們要求的是大於yi-xi的最小的y+x,而xj>xi這個條件已經由插入順序滿足了

這樣我們成功的解決了這個區域的點

而其他區域的點我們可以通過座標變換轉移到這個區域

由於對稱性,我們注意到其實只要求x軸或y軸正半軸所在的四個區域就行了

那麼這個問題就這樣解決了

#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include //#define fin freopen("input.txt","r",stdin);

//#define fout freopen("output.txt","w+",stdout);

using namespace std;

typedef long long ll;

const int inf = 0x3f3f3f3f;

const int mod = 1e9 + 7;

const double eps=1e-8;

const double pi=acos(-1.0);

const int n=50010;

struct point

}}//並查集初始化

void init_union_find(int n)

}//查詢樹的根

int find(int x)

//合併x和y所屬的集合

void unite(int x,int y)

}//判斷x和y是否屬於同乙個集合

bool same(int x,int y)

bool cmp(const edge& a,const edge& b)

int kruskal()

}return ans;

}int main()

e=0;

make_edge();

printf("%d\n",kruskal());

}

51nod1213 二維曼哈頓距離最小生成樹

二維平面上有n個座標為整數的點,點x1 y1同點x2 y2之間的距離為 橫縱座標的差的絕對值之和,即 abs x1 x2 abs y1 y2 也稱曼哈頓距離 求這n個點所組成的完全圖的最小生成樹的邊權之和。input 第1行 1個數n,表示點的數量。2 n 50000 第2 n 1行 每行2個數,表...

二維曼哈頓最小生成樹

所以我們只要求乙個點在其45 角的區域內離他最近的點就行了,而這可以用線段樹或樹狀陣列解決 我們以y軸正半軸往右偏45 角的區域為例 點j在點i的這個區域要滿足的條件是 yj xj yi xi 且xj xi 那麼我們將點以x為第一關鍵字,y為第二關鍵字,排序後倒序插入線段樹 線段樹的線段這一維是離散...

51nod 1183 編輯距離(二維dp)

1183 編輯距離 基準時間限制 1 秒 空間限制 131072 kb 分值 0 難度 基礎題 編輯距離,又稱levenshtein距離 也叫做edit distance 是指兩個字串之間,由乙個轉成另乙個所需的最少編輯操作次數。許可的編輯操作包括將乙個字元替換成另乙個字元,插入乙個字元,刪除乙個字...