time limit: 1 second
memory limit: 32 mb
聚類方法要求將空間中的點集,按照一點的方式進行歸類,要求每一類中的點集相互之間的距離足夠的「近」。
聚類的一般方法是選取某乙個點p,並用乙個距離r作為度量,只要空間中的點q距離點p的距離不超過r時,我們說點q和點p是屬於同一類的。
現在我們考慮這麼乙個問題:
給定二維空間中的n個點,並給定乙個點p,你的任務就是求出在給定這n個點的點集中,距離點p的距離不超過r的最近點的距離。點a(x1,y
1)和點b(x2,y
2)之間的距離定義為dis(a,b)=|x1-x
2|+|y1-y
2|。輸入資料的第一行為兩個整數n (10≤n≤100,000)和r(1≤r≤100),分別表示點集中一共有n個不同的點,最近距離必須不超過r。
之後有n行,每行有兩個整數x和y(-10,000≤x,y≤10,000),表示二維空間的乙個點(x,y)。
之後一行有乙個整數q(1≤q≤10,000),表示詢問的次數,之後q行,每行有兩個整數px和py,表示詢問在給定的n個點中,距離點(px,py)的距離不超過r的最近點的距離。
距離點(px,py)的距離不超過r的點數不會超過100個。
對於每個詢問,輸出最近距離,如果不存在最近點距離,輸出「-1」。
5 11 32 6
5 3-1 5
6 52
2 33 2
1【題解】-1
kd-tree的講解。請在目錄裡面選kdtree分類。就可以看到一遍詳解的文章。
這道題就是要求最鄰近的點距離。
如果直接用kd-tree的模板,沒法過。最後乙個點會超時。
我們在看到當前點離分介面的距離比當前更新到的最短距離小的時候。會往另外乙個兒子方向走。
那麼我們可以加一句if 離分介面的距離 > r 則不往另乙個兒子走。
因為大於r了。往另乙個方向走肯定不能得出小於r的結果。沒必要更新。
就是變成曼哈頓距離了。
nth_element(a + begin, a + m, a + 1 + end, cmp);
的範圍是左閉右開。
所以要加1.
然後m左邊就全是小於|等於a[m],右邊全部大於||等於m。
【**】
#include #include #include const int maxn = 101000;const int inf = 2100000000;
using namespace std;
struct data2
;int n, r, fenlie[maxn] = ,v,q,ans;
data2 a[maxn],op;
double fc[2];
int cmp(data2 a, data2 b) //寫成結構體比較好寫比較函式。
void build(int begin, int end)
if (fc[0] > fc[1])
fenlie[m] = 0;
else
fenlie[m] = 1;
v = m;
nth_element(a + begin, a + m, a + 1 + end, cmp);
build(begin, m - 1);
build(m + 1, end);
}void input_data()
void query(int begin, int end)
else }
void output_ans()
}int main()
單詞最近距離
有一篇文章內含多個單詞,現給定兩個單詞,請設計乙個高效演算法,找出文中這兩個單詞的最短距離 即最少相隔的單詞數,也就是兩個單詞在文章中位置的差的絕對值 給定乙個string陣列article,代表所給文章,同時給定文章的單詞數n和待查詢的兩個單詞x和y。請返回兩個單詞的最短距離。保證兩個單詞均在文中...
凸包最近距離 旋轉卡殼
original link 題意 給出兩個順時針排序好的凸包,求這兩個凸包的最近點對距離。解析 旋轉卡殼的另外乙個應用。先找出p1p1 p1中的最低點,p2p2 p2中的最高點,然後旋轉 順時針逆時針隨意,要保證兩個切線旋轉方向相同 每次p1 p1p1 的切線旋轉到與一條邊重合,找出p2p2 p2中...
附近距離計算
之前寫附近資訊的時候需要在資料庫專門制定合適的演算法,在網上也看了各位前輩的一些sql。不過總覺得那些sql執行的結果不是很滿意,精度不是很高,取得的資料與目的有差異。所以自己寫了乙個,今天在這裡分享出來。select abs lng blng 111 abs lat blat 111 abs co...