[Usaco2013 Jan] Square Overlap


題目鏈接: http://www.usaco.org/index.php?page=viewproblem2&cpid=227

官方題解:http://www.usaco.org/current/data/sol_squares.html


模型:有n個大小相同的正方形,問是否存在兩個正方形有公共部分,若僅有一個公共部分,求出它的面積;若沒有,輸出0;否則輸出-1.


以下是我在比賽期間死磕出來的算法:

記以A爲中心,k爲邊長的正方形爲正方形A

建立一個用來描述中心點所在區域的數組area[][][],其中area[x][y][n]表示第n個落在以(xk, yk)爲左下角,邊長爲k的正方形區域(不包括上邊和右邊)內的點的編號(顯然area[][][]很容易進行初始化)。

定理:兩個正方形A,B有公共部分必須滿足這兩個點所在的正方形區域M,N有公共點。

證明:(稍後補上) 偷個懶

當然這並不是充分條件,所以我們需要重新判斷正方形A,B之間的是否由公共部分。由此可以得出算法:枚舉每一個點A,判斷與它所在區域有公共點的9個區域中是否有點B滿足A,B有公共部分並求出其面積。

由於幾乎所有區域中最多隻會有一箇中心點(若存在兩個有兩個(或更多)中心點的區域,答案即爲-1),所以該算法的時間複雜度爲O(n)


最後吐槽一下:數據的第9個點的k是奇數,但題目描述保證k爲偶數,於是就悲劇了。。。


(代碼正在修改中)代碼就不貼了哈


由於我不知道我用的到底是什麼算法,暫且歸爲ad hoc吧!


UPD: 官方數據的第9個點已經改正。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章