程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> POJ 2932 掃描線思想

POJ 2932 掃描線思想

編輯:C++入門知識

這個題確實太神奇了

大意就是給出了n個互不相交的圓。 各個圓之間有可能一個完全包含了另一個。這裡包含就是一個圓整個都被另一個圓圈再裡面。

現在求那些沒有被包含的圓的序號。

數據量是4W

所以N2的肯定不行。

苦思冥想,不得其解

 


看了這個之後不由得大呼數據結構之博大精深

大意就是類似於我們經常用的那種掃描線,只不過這裡是圓。

每個圓有最左邊的點和最右邊的點。我們就是從左到右按順序把這些點掃一遍。

掃的過程中呢,如果掃到了一個圓的左端點,那麼就要看這個圓是否被包含了,如果沒被包含,就加入我們設計的數據結構中。那麼怎麼判斷有沒有被包含了呢,最裸的想法是看是否被之前數據結構中的圓包含。實際上只需要跟數據結構中跟自己圓心縱坐標相近的上下兩個圓來判斷即可了,因為此時我們設計的數據結構中一定都是一些互不包含的一些圓,如果新進的這個圓被包含了,那麼那個包含它的圓必然在其相鄰的地方。

如果掃到了一個圓得右端點呢,就要把這個圓刪除掉了,因為再往後的圓不會跟它發生關系了。

根據這個能插入,能刪除,能找相鄰的條件,可以發現,用set 來實現是再好不過了。

 


 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved