BZOJ3707 圈地 (幾何,旋轉座標系)

2022-05-03 12:03:34 字數 1494 閱讀 4927

description

2維平面上有n個木樁,黃學長有一次圈地的機會並得到圈到的土地,為了體現他的高風亮節,他要使他圈到的土地面積盡量小。圈地需要圈乙個至少3個點的多邊形,多邊形的頂點就是乙個木樁,圈得的土地就是這個多邊形內部的土地。(因為黃學長非常的神,所以他允許圈出的第n點共線,那樣面積算0)

input

第一行乙個整數n,表示木樁個數。

接下來n行,每行2個整數表示乙個木樁的座標,座標兩兩不同。

output

僅一行,表示最小圈得的土地面積,保留2位小數。

sample input

30 0

0 11 0

sample output

0.50

題解:如果我們確定了2個點以後,第三個點有必要去盲目的列舉嗎?答案是否定的。實際上我們把經過這兩點的線看成乙個斜率,把他當成y軸你會發現第三個點明顯是在座標系左右找乙個離」y軸」最近的點來算面積更新答案。然後我們可以繼續思考,發現我們可以把點按照某個斜率當成」y軸」進行「從左到右」的排序,這樣當2點共線的時候,用這兩個點的左右2個點去更新答案就好了。也就是說我們採用旋轉座標系的方法,一開始按x座標排好序,認為直接用豎著的那條斜率,然後維護的話每次其實當兩點共線後只要交換他們就能得到斜率轉過該事件點的序列。所以我們可以預處理出所有可行的斜率,當成事件點,不斷轉動座標系更新答案就好。這樣複雜度只有n^2。

**:

int n;

struct point

point(int xx, int yy)

bool operator < (const point &b)const

point operator - (const point &b) const

ll operator ^ (const point &b) const

} a[1010];

#define eps 1e-6

struct line

line(int xx, int yy)

bool operator < (const line &b) const

};std::vectorv;

ll ans = 1e18;

ll cal(int i, int j, int k)

int id[maxn];

int info[maxn];

int main()

sort(a + 1, a + 1 + n);

repd(i, 1, n)

id[i] = info[i] = i;

}sort(all(v));

for (auto l : v)

if (id[t1] > 1)

if (id[t2] < n)

swap(id[t1], id[t2]);

info[id[t1]]=t1;

info[id[t2]]=t2;

}printf("%.2f\n", 0.5 * ans );

return 0;

}

BZOJ3707 圈地 計算幾何

2維平面上有n個木樁,黃學長有一次圈地的機會並得到圈到的土地,為了體現他的高風亮節,他要使他圈到的土地面積盡量小。圈地需要圈乙個至少3個點的多邊形,多邊形的頂點就是乙個木樁,圈得的土地就是這個多邊形內部的土地。因為黃學長非常的神,所以他允許圈出的第n點共線,那樣面積算0 對於100 的資料,n 10...

BZOJ 3707 圈地 (動態凸包)

傳送門 題意 給n 個點,求最小三角形。n 1000 題解 好題啊。後面有動態凸包 有一種簡單的做法 首先如果選定了底邊的兩點,那麼還需要選擇一條離這條底邊最近的點。將當前座標系y軸旋轉這條底邊,那麼選擇 x 最小的點。考慮按照斜率從小到大列舉底邊。對於兩個點a,b 來說,若一條底邊c,d 的斜率小...

bzoj 3232 圈地遊戲

題意 在乙個n m的網格裡,邊上有花費,格里有權值 從任意乙個點開始繞一圈,繞乙個簡單環出來,裡面的所有格仔就是收益 求最大的收益 花費 所有數 100 題解 考慮01分數規劃的方式,但是花費和權值不在一起 那麼考慮將格內的權值轉化到邊上 實際上將邊有向化,按邊方向左面一行的權值為正,右面為負,加起...