簡體   English   中英

尋找對的更有效方法

[英]More efficient approach for finding pairs

我最近遇到了一個問題,它說要找到好的一對圈數。 當通過連接第一圓上的任何點P1和第二圓上的P2時可以獲得給定距離時,形成一對良好的圓。 我們給出N個圓和Q距離。 接下來的N行包含圓心的坐標( XY )及其半徑R. 之后,下一個Q列出要檢查的距離。

以下限制適用:

2≤N≤10 3

1個≤Q≤5⋅105

X,Y≤|2⋅105 |

1個≤[R≤2⋅105

0≤ķ≤10 6

執行時間必須<1秒。

在這里, K是要檢查的距離。

刪除了我的代碼,因為它是正在進行的競賽的一部分

我的代碼只被部分接受了,我花了好幾個小時試圖為這個問題找到一個有效的算法。 任何人都可以為這個問題提供一個有效的方法,以便TLE得到解決?

這是我可以從頭腦中思考的可能解決方案:

  • 迭代每對圓(c 1 ,c 2 )並計算兩個值(PS(c 1 ,c 2 )與(c 2 ,c 1 )不同)
    1. 如果c 2完全位於c 1內,則忽略該對。
    2. 1 - 圓c 1和c 2之間的最短距離, - 它們的中心之間的距離 - r 1 - r 2表示不相交的圓, 0表示相交的圓, r 2 - dist - r 1表示c 1的位置在c 2內
    3. 2 - 應增加r 1的最小值,使得c 1完全吞沒c 2 ,使得它們根本不相交 - 這是它們的中心之間的距離+ r 2 - r 1用於不相交或相交的圓和dist + r2休息。
  • 該范圍[ 12 ]定義了圓c 1的半徑應該增加的量,使得它與c 2相交,在我們的情況下由c定義。如果K屬於范圍[ 12],那么我們可以gaurantee會有離開的點P 1上的C 1和點P 2上的C 2,使得它們之間的距離是K.這是因為如果我們增加C1 半徑在該范圍內,它將與c 2相交。
  • 上述操作將具有時間復雜度O(n 2 )。 我們可以從所有可能的圓圈對中收集所有范圍,並回答我們只需要檢查給定K所在的范圍是否需要的任何查詢。
  • 為了方便查詢,我們可以使用二進制索引樹來存儲我們的范圍,其中我們在索引1處添加+1,在索引( 2 + 1)處為-1添加二進制索引樹,然后為每個查詢檢查是否讀取在索引K上> 0。使我們能夠在O(log(K))中返回任何查詢的答案。 構造樹的成本是O(N 2 log(K)) - 包括形成所有圓對。
  • 我們還可以使用輔助數組而不是二進制索引樹來回答O(1)中的查詢,如果需要,我願意討論其范圍。

至於輔助數組方法,初始化一個長度為K的數組,即10 ^ 6,所有元素最初都設置為0.現在維護所有值1的最小堆和所有值為Value 2的另一個最小堆。 現在,

aux_array = [0, 0, ... ]
curVal = 0
for i in range(0, 10^6):
  while minHeapValue1.root() == i:
     curVal += 1
     minHeapValue1.rootPop()
  while minHeapValue2.root() == i:
     curVal -= 1
     minHeapValue2.rootPop()
  aux_array[i] = curVal

現在,如果aux_array [query_k_value]> 0,則表示存在包含query_k_value的范圍,否則不存在。

因此,問題的總時間復雜度為O(Qlog(K)+ N 2 log(K))。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM