2014-02-26 48 views
0

我發現了這個問題,稱爲來自2013年JBOI的循環馬拉松:http://www.math.bas.bg/infos/files/2013-11-24-B2_eng.pdf循環馬拉松(JBOI 2013)

我一直在試圖解決它一段時間,但沒有運氣......你介意指導我找到解決方案嗎?

感謝

+0

可視化問題,我在想是否比較所有對跑步者的距離會有所幫助.... – user2455103

+0

編輯您的問題,並添加您嘗試到目前爲止有更高機會得到答案。 – CSchulz

回答

3

一種可能是當前的運動員存儲在雙向鏈表(做,一旦他們被淘汰很容易地刪除亞軍)。

對於第一個跑步者比第二個跑步者要快的連續跑步者,計算他們將會見的時間並將此次存儲在堆數據結構中(該堆包含會議時間和指向第二個跑步者的指針)。

該堆將允許您找到下一個參賽者(這將是堆頂部的一對),然後您可以及時更新數據結構O(logn)並重復,直到堆爲止空。

的更新將需要:

  1. 標誌着季軍是在比賽
  2. 從鏈表
  3. 來自第一流道來添加新的會議時間刪除季軍不再接下來在列表中(只有當亞軍也夠快)
  4. 重新平衡堆

如果這次會議中的第一名跑步者已經從比賽中刪除,那麼更新應該跳過。

總的來說,這需要花費時間O(nlogn)。

+0

是的,這很接近我的想法......我只是意識到,一個跑步者不能消除另一個時,他不是連續的,他必須在這個過程中遇到更多的跑步者。所以,我們只需要找到兩名運動員將會見面的時間。 – user2455103

+0

而且......我可以假設它只是儘可能使用優先級隊列而不是堆權? – user2455103

+0

@ user2455103堆是一種優先級隊列,當然如果您願意,可以自由使用不同類型的優先級隊列。 –