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)output第2 - n + 1行:每行2個數,表示點的座標(0 <= x, y <= 1000000)
輸出n個點所組成的完全圖的最小生成樹的邊權之和。input示例
3output示例0 01 0
1 1
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 是指兩個字串之間,由乙個轉成另乙個所需的最少編輯操作次數。許可的編輯操作包括將乙個字元替換成另乙個字元,插入乙個字元,刪除乙個字...