1. 程式人生 > >6月題目彙總1(6.6---6.13)

6月題目彙總1(6.6---6.13)

6.6上午

NO.1 來源 : UVa 1318 Monster Trap

分類: 計算幾何,平面直線圖

簡要題解:

  • 首先從所有線段的端點中出不在任何一條線段(端點不算)上的點的集合S,再加上(0,0),(inf,inf)這兩個點。
  • 對於S中的兩個點a,b,如果線段a,b不和任何給出的線段相交,那麼給a,b連上邊。
  • 但這樣會線上段的公共端點處出現問題,解決的方案是把每條線段延長一點點,使原先有公共端點的線段相交。
  • BFS判斷(0,0)(inf,inf)是否聯通即可。

反思:

  • 注意伸長量deltaeps的大小關係,取delta=105,eps=1010可以過。
  • 複習:判斷線段相交,點線上段上。

6.6晚

NO.2 來源 : UVa 1340 Find the Border

分類: 計算幾何,平面直線圖(PSLG)

簡要題解:

  • PSLG模板。題解請看LRJ的白皮書。

反思:

  • 對點進行排序時的浮點比較要用dcmp()。

6.8上午

NO.3 來源 : BZOJ 4184 shallot

分類: 分治,線性基

簡要題解:

  • 求一堆數可以異或出來的最大值,顯然可以用線性基。
  • 有刪除操作怎麼辦?對時間進行分治,具體來說:
    • 用一個類似線段樹的結構,每個節點用一個vector存下對這個整個區間有貢獻的數。
    • 最後遍歷這棵樹,走到葉子節點就可以回答對應的詢問。
    • 線性基要當引數逐層傳遞,不能用一個全域性變數。

反思:

  • Hash大法好(比stl快至少一倍)。
  • 但是要維護的東西比較麻煩(不像線性基可以當引數傳遞怎麼辦)?

6.8上午

NO.4 NKOJ 4140 ces

分類: 無向圖的連通性

簡要題解:

  • 先考慮k=1的情況
    • 如果是一棵樹,那麼答案就是直徑的長度。
    • 否則,將環縮成一個點之後形成的新的樹的直徑。
  • 取新樹的重心,可以保證樹高為logn級別。
  • 顯然加入一條邊可以使某條路徑上的邊全部變成不是橋,肯定貪心的選擇最長的路徑。
  • 用一個堆維護所有的由橋邊構成的單鏈(為了避免重複計算,路徑應該被拆解成為單鏈)。

反思:

  • 從樹到圖的橋樑——把環縮成點(也就是選代表節點,可以用並查集實現)。
  • k=1到一般情形的轉化——貪心+巧妙的討論和維護路徑。

6.8上午

NO.5 來源 : Codeforces Round #418 (Div. 2) E - An unavoidable detour for home

分類: dp,組合數學

簡要題解:

  • 可以發現最後的圖一定形成類似樹的結構,只不過同層之間可以連邊。
  • 考慮逐步加入一個點x(已經有x1個點),設當前的層數為l:
    • 如果l1這一層還有多餘的度數,x號點必須接在l1層的點下面,否則可以另起一層。
  • f(x,p1,p2,c1,c2)表示加入x個點,l1層上剩餘1度、2度的點分別有p1,p2個,l層上剩餘1度、2度的點分別有c1,c2個的方案數。
    • 答案為f(n,0,0,0,0),時間複雜度O(n5)

反思:

  • 轉移比較多,每一種考慮清楚。特別是另起一層的時候容易錯

6.10上午

NO.6 來源 : BZOJ 4205 卡牌遊戲

分類:網路流

簡要題解:

  • 暴力構圖+匈牙利演算法複雜度可以得到35分.
  • 考慮到按照匹配建圖邊數過多,我們採用將邊分類的方法優化。
    • 考慮a項屬性值能被x整除且b項能力值能被y整除的所有點,只要是在兩側一定能夠匹配,所以我們在匹配的網路流模型中間增加一排這樣的點,滿足要求的左右點分別與它相連,邊權為正無窮。
    • 考慮到x和y只需是質數,這樣的點共有至多3*46*46個(1~200質數共46個),而200<2*3*5*7,所以兩側每個點至多連出3*3*3條邊。
    • 於是我們構成了一個70000個點,2000000條邊的網路流,依然是分層圖,所以dinic有極佳的速度優勢,通過100分資料。

反思:

  • 找到題目和最大匹配的相同性,利用特殊性來優化。
  • 匹配在網路流上的表達就是兩行點聯通。

6.10下午

NO.7 來源 : BZOJ 4206 最大團

分類:計算幾何,區間問題

簡要題解:

  • 對於每一個點,向圓作兩條切線,切點之間的弧可以用一個極角區間[li,ri]來表示。
  • 兩個點i,j可以連邊等價於[li,ri][lj,rj] 相交併且不包含。
  • 對極角區間排序之後,考慮從每一個點i 開始 in 能組成的最大團:
    • 對每一個滿足lj[li,ri]rj>rij(i<jn),將rj加入佇列Q。
    • 求Q的最長上升子序列即可。

反思:

  • 如果採用到圓心的距離作為連邊的判斷依據,就不能轉化為區間的問題,也沒有很好的利用題目條件。