BZOJ3707 圈地 計算幾何

2021-09-25 20:52:08 字數 1552 閱讀 5484

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

對於100%的資料,n<=1000。

思考乙個n

2n^2

n2演算法,不難想到對於n

2n^2

n2條線段(兩點),最優的第三點離該線段最近。相當於把線段看成y

yy軸旋轉。

如何o(1)找到最近點? 在前後兩條線段的 決策點的x′x'

x′遞增序列 中,有大部分的相對位置未變。換而言之,對於任意兩點,設為i

ii,j

jj,假設x

i

x_xi

​​,只有線段ijij

ij轉過了y

yy軸後,才有x

i>xj

x_>x_

xi​>xj

​.將所有線段按照 斜率(或極角)排序,對於當前線段上的兩點,轉移到下一線段時,只有這兩點的相對位置改變,交換即可。

#include

#define pf printf

#define sf scanf

#define cs const

#define ll long long

#define db double

#define int long long

using

namespace std;

cs int n=

1e3+10;

cs db eps=

1e-7

,inf=

1e18

;struct vector

friend vector operator

+(cs vector &a,cs vector &b)

friend vector operator

-(cs vector &a,cs vector &b)

friend

intoperator

^(cs vector &a,cs vector &b)

bool

operator

<

(cs vector &t)cs

}p[n]

;struct line

}l[n*n]

;int n,rk[n]

,sam[n]

,cnt=0;

inline db area

(cs vector &a,cs vector &b,cs vector &c)

signed main ();

}sort

(l+1

,l+cnt+1)

; db ans=inf;

for(

int i=

1;i<=cnt;

++i)pf(

"%.2lf"

,ans)

;return0;

}

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

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

BZOJ 3707 圈地 (動態凸包)

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

bzoj 3232 圈地遊戲

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