我們給出N(N < = 10 )上的2D平面和整數d點(N < = 10 ),我們希望更大的查找最小元素找到兩個點p1,p2(在p1右邊的p2),使得p1.y
和p2.y
之間的差值至少爲D並且p2.x - p1.x
被最小化。在給定的範圍內比給定數目
的x和y軸是範圍0..10
這是從過去USACO競賽一個problem。
這裏是我的嘗試來解決它:
MAXY = N點中的最大y軸。
假設我們知道p1,那麼我們可以很容易地找到p2;通過將y軸在p1.y+D
範圍內的所有點取爲MAXY或取值範圍爲0到p1.y-D
,並取x軸最小的點大於p.x
。這將是p2的最佳選擇。
但是,由於我們不知道P1,我們將不得不嘗試P1的所有點,因此找到P2的最佳選擇應該是有效的。
我爲此使用了細分樹。樹中的每個節點將按x軸的排序順序存儲相應範圍內的所有點。在查詢時,如果一個節點落在查詢範圍內,那麼我們在數組上進行二進制搜索以獲得p1.x
,並返回大於它的最小元素。
對於p1的每一次選擇,我們用範圍0,p1.y-D和p1.y + D,MAXY查詢樹兩次,並取回返兩點中的最好值。
樹的建築可以在O(NlogN)時間完成。 每個查詢將花費O(logN * logN)時間,並且我們進行N次查詢,因此總時間爲(Nlogn * logn),可能無法在2秒的時間限制內運行。 (10 * 20 * 20)。 此外內存採取將是O(NlogN),這是約80 MB(100000 * 20 * 4 kb)這是太多,因爲極限是64 MB。
我們如何更快地查詢查詢並使用較小的空間?
是的,你是正確的N <10^5,但你的解決方案比使用細分樹更聰明。 – 2147483647
@ A.06和米哈伊爾,如果我有'[(1,1),(2,2),(3,3),(5,5)]'和'D = 3'的點。第一個二進制搜索不會刪除該解決方案所需的「(2,2)」點嗎? –
@groovy在第一次迭代時會刪除X-sorted數組的點(1,1),(2,2)和(3,3)。但是在第二次迭代時,它將需要點(2,2)形式的Y-sorted數組,我們沒有清楚並且會找到正確的答案,點(5,5)。 –