題目鏈接: 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個點已經改正。