計算幾何

acm_cxlove發表於2013-08-18
這兩天在學習計算幾何,隨便說說自己的學習過程吧。

  基本的叉積、點積和凸包等東西就不多說什麼了,網上一搜一大堆,切一些題目基本熟悉了就差不多了。

  一些基本的題目可以自己搜尋,比如這個blog:http://blog.sina.com.cn/s/blog_49c5866c0100f3om.html

  接下來,研究了半平面交,思想方法看07年朱澤園的國家隊論文,模板程式碼參考自我校大牛韜哥:

http://www.owent.net/2010/10/acm-%E8%AE%A1%E7%AE%97%E5%87%A0%E4%BD%95-%E4%B8%AA%E4%BA%BA%E6%A8%A1%E6%9D%BF.html

  一些半平面交的題目:

  POJ 3335 Rotating Scoreboard
  http://acm.pku.edu.cn/JudgeOnline/problem?id=3335


  POJ 3130 How I Mathematician Wonder What You Are!
  http://acm.pku.edu.cn/JudgeOnline/problem?id=3130


  POJ 1474 Video Surveillance
  http://acm.pku.edu.cn/JudgeOnline/problem?id=1474
  知識點:半平面交求多邊形的核,存在性判斷


  POJ 1279 Art Gallery
  http://acm.pku.edu.cn/JudgeOnline/problem?id=1279
  半平面交求多邊形的核,求核的面積


  POJ 3525 Most Distant Point from the Sea (推薦)
  http://acm.pku.edu.cn/JudgeOnline/problem?id=3525
  給出一個多邊形,求裡面的一個點,其距離離多邊形的邊界最遠,也就是多邊形中最大半徑圓。
  解法:可以使用半平面交+二分法解。二分這個距離,邊向內逼近,直到達到精度。


  POJ 3384 Feng Shui (推薦)
  http://acm.pku.edu.cn/JudgeOnline/problem?id=3384
  半平面交實際應用,用兩個圓覆蓋一個多邊形,問最多能覆蓋多邊形的面積。
  解法:用半平面交將多邊形的每條邊一起向“內”推進R,得到新的多邊形,然後求多邊形的最遠兩點。


  POJ 1755 Triathlon (推薦)
  http://acm.pku.edu.cn/JudgeOnline/problem?id=1755
  半平面交判斷不等式是否有解。注意不等式在轉化時正負號的選擇,這直接影響到半平面交的方向。


  POJ 2540 Hotter Colder
  http://acm.pku.edu.cn/JudgeOnline/problem?id=2540
  半平面交求線性規劃可行區域的面積。


  POJ 2451 Uyuw’s Concert
  http://acm.pku.edu.cn/JudgeOnline/problem?id=2451
  Zzy專為他那篇nlogn演算法解決半平面交問題的論文而出的題目。

 

  (以上題目來自別人的blog,後面還有幾題是我自己找到的)

  POJ 1271 Nice Milk
  http://poj.org/problem?id=1271
  黑書習題

 
  UVA 11722 Joining with Friend
  http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=117&page=show_problem&problem=2769
  概率問題,這個規模用半平面交有點浪費,不過就當練習了

 
  USACO 2010 MARCH GOLD StarCowraft
  http://61.187.179.132:8080/JudgeOnline/showproblem?problem_id=1829
 
  

 

 
 
 
 
 
 
 
 

  接下來稍微弄了一下座標旋轉的問題,具體可以參考武漢大牛的博文http://dumbear.com/blog/?p=143

  座標旋轉題目切得不多

  HDU 1700 Points on Cycle
  http://acm.hdu.edu.cn/showproblem.php?pid=1700
  比較基礎的一道題
 
  POJ 3845 Fractal
  http://poj.org/problem?id=3845
  注意eps的取值
 
  POJ 1133 Stars
  http://poj.org/problem?id=1133
 
  Harbin Online Contest 2010
  http://acm.hrbeu.edu.cn/index.php?act=problem&id=1006&cid=16
  三維座標旋轉。這個要有賬號才能提交,還有就是Sample Input 中第二個Sample的“275”改成“270”
 
  HDU 3623 Covering Points (2010天津網路賽C題)
  http://acm.hdu.edu.cn/showproblem.php?pid=3623 (航電沒有這題了)
  http://acm.tju.edu.cn/toj/showp3740.html 

  FZU 2002 Shade of Hallelujah Mountain (2010福州regional)
  http://acm.fzu.edu.cn/problem.php?pid=2002

  HDU 4087 ALetter to Programmers (2011 北京現場賽)
  http://acm.hdu.edu.cn/showproblem.php?pid=4087
  三維旋轉矩陣 + 矩陣加速

 



 

 

  然後是旋轉卡殼,一個很好的學習網站http://cgm.cs.mcgill.ca/~orm/rotcal.html(不過是英文的),後來找到一個大牛的blog裡有部分翻譯http://blog.csdn.net/ACMaker,綜合起來看了一下,收益良多啊。

  一些旋轉卡殼的題目

  POJ 2187 Beauty Contest
  http://acm.pku.edu.cn/JudgeOnline/problem?id=2187
  凸包求最遠點對。可以暴力列舉,也可以使用旋轉卡殼。


  POJ 3608 Bridge Across Islands
  http://acm.pku.edu.cn/JudgeOnline/problem?id=3608
  兩個凸包的最近距離。

  上面兩題可以參考blog:http://www.cppblog.com/staryjy/archive/2009/11/19/101412.html(上面程式碼很不錯)


  POJ 2079 Triangle
  http://poj.org/problem?id=2079
  這題以為O(N^2)的複雜度會超時,結果就是O(N^2)複雜度

 
  UVA 10173
  http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&category=13&problem=1114&mosmsg=Submission+received+with+ID+8029560
  給定點集S,求S的最小覆蓋矩形
 
  
 





  然後看了一些掃描線之類的東西。

  推薦幾道比不錯的題目:

  POJ 2932 Coneology
  http://poj.org/problem?id=2932
 
  HDU 3124 Moonmist
  http://acm.hdu.edu.cn/showproblem.php?pid=3124
  最近圓對問題(二分 + 掃描線)

  HDU 3867 Light and Shadow
  http://acm.hdu.edu.cn/showproblem.php?pid=3867
  (按極角掃描)注意-PI和PI的位置分割




  下面看了一些隨機演算法:(08年顧研論文-《淺談隨機化思想在幾何問題中的應用》)

     (1)隨機增量法:這個演算法很犀利啊,把一些計算幾何的問題降了一個n複雜度。(典型的有最小圓覆蓋)

        網上找了最小圓覆蓋的隨機增量演算法,裡面程式碼倒是不錯,就是解釋的不是很清楚,推薦看《計算幾何演算法與應用(第3版)》(鄧俊輝譯,清華大學出版社出版)中第91頁“4.7最小包圍圓”這個章節中的內容,比較詳細也很清楚,程式碼我參考了這個blog的http://blog.csdn.net/pvpishard/archive/2011/01/27/6167262.aspx

    (2)模擬退火:參考顧研論文

      模擬退火的題目:

      POJ 1379 Run Away
      http://poj.org/problem?id=1379
 
      POJ 2420 A Star not a Tree?
      http://poj.org/problem?id=2420
 
      URAL 1520 Empire Strikes Back(推薦)
      http://acm.timus.ru/problem.aspx?space=1&num=1520
      顧研論文例題,不錯的題目
 
      POJ 2069 Super Star
      http://poj.org/problem?id=2069
      此題我WA和TLE了很多次
 
      POJ 3301 Texas Trip
      http://poj.org/problem?id=3301
      這題也可以用三分
      
      SPOJ 4409 Circle vs Triangle
      https://www.spoj.pl/problems/AREA1/
      模擬退火 + 解析幾何
 
      POJ 3285 Point of view in Flatland
      http://poj.org/problem?id=3285
      這題的難點在於找到合適的評估函式,當然這題也可以通過解方程組來做
 
      POJ 2600 Geometrical dreams
      http://poj.org/problem?id=2600
      這題不是模擬退火的題,但是可以用模擬退火過。非模擬退火的方法也不難
 
 
 
 
 




  解析幾何平面最近點對,。。。這些搞得也不是很深入。

 
 


  

  摺紙問題 參見大牛dumbear的blog http://dumbear.com/blog/?p=249

  兩道題目

  POJ 1921 Paper Cut
  http://poj.org/problem?id=1921
  這題相對下一題還算比較好做
 
  POJ 3806 Origami Through-Hole
  http://poj.org/problem?id=3806
  這題處理有點麻煩,我除錯了很久才過
 
 
 
 
 
 
 
 
 

  圓的面積並和交,詳細可以看AekdyCoin大牛的blog

  圓的面積並:http://hi.baidu.com/aekdycoin/blog/item/c1b28e3711246b3f0b55a95e.html

  圓的面積交:http://hi.baidu.com/aekdycoin/blog/item/12267a4e9476153bafc3abbd.html

  題目:

  SPOJ 8073 The area of the union of circles
  https://www.spoj.pl/problems/CIRU/
 
  SPOJ 3863 Area of circles
  https://www.spoj.pl/problems/VCIRCLES/

  SPOJ 8119 CIRU2
  https://www.spoj.pl/problems/CIRUT/
  圓面積並的擴充
 
  HDU 3467 Song of the Siren
  http://acm.hdu.edu.cn/showproblem.php?pid=3467
 
  HDU 3239 Jiajia's Robot (推薦)
  http://acm.hdu.edu.cn/showproblem.php?pid=3239
  很巧妙的一道題,我是看了AC大牛blog中的留言才知道到方法的。
    方法見AC大牛blog中的一條留言:http://hi.baidu.com/aekdycoin/blog/item/12267a4e9476153bafc3abbd.html
 
 
  



  凸多邊形的面積並

  先看了AC大牛的blog學會了O(N^3)的方法,後來在做Codeforces的時候發現有O(N^2*logN)的方法,而且也不繁瑣

  AC大牛的博文:http://hi.baidu.com/aekdycoin/blog/item/fbe5a03232c71952ad4b5fcc.html

  Codeforces Round #83 DIV1 的 E題用O(N^3)的方法過不掉第49組資料,然後研究了其他大牛的凸多邊形交的程式碼

  http://codeforces.com/contest/107/status/E

  先是看了dagon的程式碼發現其實他的程式碼有問題,Codeforces的資料居然沒有查出來。然後看了syntax_error的程式碼,

  發現他是用類似梯形剖分的方法做的,複雜度O(N^2*logN),果斷就學習了

  題目:http://codeforces.com/contest/107/problem/E

  有關細節:http://www.cnblogs.com/ch3656468/archive/2011/10/17/2215551.html



 

  
 
 

  一類題目是給出一些點,並告訴你哪些點之間有連線,並且這些連線段之間除端點之外沒有其他交點(有時候這些線段是要自己處理出來的)。

   然後題目要你求

    1 每小塊多邊形的面積

    2 有多少個K多邊形內部不含點和線段

    3 這些線段圍成的圖形的輪廓線

  這類題目的方法都差不多,在很多大牛的blog裡都可以找到類似的方法。

  比如: gccfeli大牛的blog:http://gccfeli.cn/2007/09/%E8%AE%A1%E7%AE%97%E5%87%A0%E4%BD%95-pku1092-%E5%A5%87%E7%89%B9%E7%9A%84%E6%8A%80%E5%B7%A7.html

      watashi大牛的blog:http://watashi.ws/blog/970/andrew-stankevich-3-solution/

      Isun大牛的blog:http://hi.baidu.com/xh176233756/blog/item/29652646f0e870006a63e5cb.html

  題目:

  POJ 1092 Farmland
  http://poj.org/problem?id=1092

  ZOJ 2361 Areas / SGU 209
  http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2361
  不錯的一題,watashi的blog裡有解題報告
 
  POJ 3743 LL’s cake
  http://poj.org/problem?id=3743
 
  POJ 2164 Find the Border
  http://poj.org/problem?id=2164

 
 



  三維幾何

  網上有關三維幾何的內容很少阿,程式碼和題目基本都不怎麼能搜到,我也就切了不多的幾題

  前面座標旋轉裡的兩到題:

 

    Harbin Online Contest 2010
    http://acm.hrbeu.edu.cn/index.php?act=problem&id=1006&cid=16
    三維座標旋轉。這個要有賬號才能提交,還有就是Sample Input 中第二個Sample的“275”改成“270”

    FZU 2002 Shade of Hallelujah Mountain (2010福州regional)
    http://acm.fzu.edu.cn/problem.php?pid=2002
 

  SGU 110 Dungeon
  http://acm.sgu.ru/problem.php?contest=0&problem=110
  三維光線反射
 
  FZU 1981 Three kingdoms (2010福州網路賽)
  http://acm.fzu.edu.cn/problem.php?pid=1981
  座標對映,我一開始用map一直TLE,只好改成不用map的程式碼 
 
  UVA 11275 3D Triangles
  http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=24&page=show_problem&problem=2250
  HDU 4042是這題的加強版,我使用同樣的程式碼AC的
  對於這題題目中詭異的精度0.000001我並沒有特別處理
 
  HDU 4042 Fireworks (2011北京網路賽)
  http://acm.hdu.edu.cn/showproblem.php?pid=4042
  很不錯的題目 (解題報告:http://hi.baidu.com/%D0%A1%CE%E4rj/blog/item/0114bb2dcd4cdef78b13991d.html)
 
  HDU 4087 ALetter to Programmers (2011 北京現場賽)
  http://acm.hdu.edu.cn/showproblem.php?pid=4087
  三維旋轉矩陣 + 矩陣加速

 



  其他一些題目:

  EOJ 283 Target Practice
  http://202.120.106.94/onlinejudge/problemshow.php?pro_id=283
  搜尋 + 幾何
 
  POJ 1688 Dolphin Pool
  http://poj.org/problem?id=1688
  這題有好幾種做法
 
  POJ 1981 Circle and Points
  http://poj.org/problem?id=1981
  很經典的一道題目
 
  POJ 3675 Telescope
  http://poj.org/problem?id=3675
  圓和多邊形的公共面積
 
  POJ 1259 The Picnic
  http://poj.org/problem?id=1259
  最大凸洞,計算幾何 + DP
 
  POJ 1586 Three Sides Make a Triangle
  http://poj.org/problem?id=1586
  題目內容很簡單,方法也很明顯,不過想AC可不容易,精度很噁心的一題,我是看了discuss才過的
  
  HDU 3629 Convex (推薦)
  http://acm.hdu.edu.cn/showproblem.php?pid=3629
  一道不錯的題目,這題有兩種思路:
    1)http://apps.topcoder.com/wiki/display/tc/TCO%2710+Online+Round+4
    2)http://www.owent.net/2010/09/the-35th-acmicpc-asia-regional-tianjin-site-%E2%80%94%E2%80%94-online-contest-1009-convex-%E8%A7%A3%E9%A2%98%E6%8A%A5%E5%91%8A.html

 
  HDU 3644 A Chocolate Manufacturer's Problem (2010杭州網路賽)
  http://acm.hdu.edu.cn/showproblem.php?pid=3644
  本來想用模擬退火水一下的,結果徘徊於WA和TLE之間無法AC
 
  FZU 1973 How many stars (推薦) (2010福州網路賽)
  http://acm.fzu.edu.cn/problem.php?pid=1973
  比較經典的一道題目
 
  POI2007 對稱軸osi
  http://www.zybbs.org/JudgeOnline/problem.php?id=1100
  很犀利的一道題目,題意是判多邊形的對稱軸個數,原來做的這種題目都是用O(N^2)的複雜度來解的
  這次O(N^2)果斷不行,加隨機化也過不了,最後在解題報告的指導下才搞定這題。第一次發現計算幾何
  的問題居然還能用字串的方法解。
  網上搜到的解題報告:http://hi.baidu.com/nplusnplusnplu/blog/item/d260baef2e9e9c5879f055cb.html
 
 


  下次再搞計算幾何的時候會更加深入一些。

相關文章