1. 程式人生 > >NOIP模擬賽,禮物,線段樹優化建圖

NOIP模擬賽,禮物,線段樹優化建圖

正題

      題目是這樣的:

      Rose一共有n個禮物,他女朋友也有n個禮物。

      這些禮物有兩個權值(x,y),x表示的是該禮物在Rose眼裡的重要度,y表示的是該禮物在其女朋友眼裡的重要度。

      當一個人收到自己眼裡價值為k的禮物時,會回贈在自己眼裡在[k,k+d]的禮物。

      當一個人收到自己眼裡價值為0的禮物時,會覺得對方沒有誠意,所以就會停止送禮物。

      問Rose先送第i個禮物給其女朋友,最快什麼時候會結束送禮物。(操作由你決定。

      n<=10^5,x,y<=10^9,d<=10^9

      題解:

      我們把Rose和其女朋友的禮物分成兩堆點,那麼我們可以對這兩堆點進行連邊。

      邊表示什麼呢?

      表示的是,當送i禮物的時候,另一方可以回贈j禮物。那麼我們從i到j建一條權值為1的邊。

      特殊的,左邊的y權為0的點和右邊x權為0的點向ed連一條權值為1的邊,表示結束。

      因為是求多個點到一個點ed的最短路,所以我們把邊反著建,求ed到多個點的最短路就是答案了。

      好的,因為資料過水,已經是正解了

      考慮線段樹優化建圖,左邊按x來排序,右邊按y來排序,那麼當從左邊向右邊連邊的時候,連的一定是連續的一段點。

      右邊往左邊也一樣,那麼這兩個端點可以通過二分查詢。

      線段樹優化一下建圖就可以了。

      最後,因為線段樹裡面的邊是0邊,其他的邊都是1邊,要跑最短路?

      不用,跑雙端佇列bfs就可以了,相關證明無處可尋,感性理解即可。