BZOJ 3707 圈地 (動態凸包)

2021-08-10 23:14:48 字數 2738 閱讀 7445

傳送門

題意: 給n

個點,求最小三角形。(n

≤1000)

題解:

好題啊。。

(後面有動態凸包)

有一種簡單的做法:

首先如果選定了底邊的兩點,那麼還需要選擇一條離這條底邊最近的點。

將當前座標系y軸旋轉這條底邊,那麼選擇|x

| 最小的點。

考慮按照斜率從小到大列舉底邊。

對於兩個點a,

b 來說,若一條底邊c,

d 的斜率小於a,

b 斜率,且在c,

d 的座標系下ax

>bx

,那麼在所有斜率小於a,

b 的座標系下都滿足ax

>bx

。所有斜率大於a,

b 的底邊都滿足bx

>ax

。那麼一開始建立乙個序列,每次列舉到a,

b 邊就交換a,

b 位置就可以保證序列一直有序,查詢可以做到o(

1)。總時間複雜度o(

n2logn)

#include

using

namespace

std;

inline

int read()

while(isdigit(ch))

return i*f;

}const

int maxn=1e3+50;

const

double inf=1e18;

int n,tot,pos[maxn];

double ans=inf;

struct point

friend

inline

bool

operator

<(const point &a,const point &b)

friend

inline

double

operator *(const point &a,const point &b)

}p[maxn];

struct line

int main();

sort(l+1,l+tot+1);sort(p+1,p+n+1);

for(int i=1;i<=n;i++)pos[p[i].id]=i;

for(int i=1;i<=tot;i++)

printf("%.2f\n",ans/2.0);

}

動態凸包:

考慮按照x軸依次加入點,將所有橫座標比他大的點按照到這個點的極角排序,考慮所有包含當前點的三角形必然是由這個點到右邊某個點的直線加上乙個最近距離點構成的,依次加入點之後在凸包上找就行了。時間複雜度o(

n2logn

) (**是真的難調,可讀性可能比較低。。)

#include

using

namespace

std;

inline

int read()

while(isdigit(ch))

return i*f;

}const

int maxn=1e3+50;

const

double inf=1e18;

const

double eps=1e-9;

int n,now;

double ans=inf;

struct point

friend

inline point operator -(const point &a,const point &b)

friend

inline

double

operator *(const point &a,const point &b)

inline

double norm()

}p[maxn],tp[maxn],tp2[maxn];

#define calc(a,b,c) (fabs((a-b)*(c-b)))

inline

bool cmpx(const point &a,const point &b)

struct cmp_slope

};set

s_x;

sets_t;

typedef

set::iterator it;

inline point findsuf(const point &a)

inline

void ins(const point &a)

else

break;

}point tmp=a;tmp.slope=atan2(a.y-pre->y,a.x-pre->x);

s_x.insert(tmp);s_t.insert(tmp);

}else insbz=1;

if(suf!=s_x.end())

else

break;

}point tmp=*suf;

s_t.erase(s_t.find(*suf));

s_x.erase(suf);

tmp.slope=atan2(tmp.y-a.y,tmp.x-a.x);

s_t.insert(tmp);s_x.insert(tmp);

}if(insbz)

}int main()

}printf("%.2f\n",ans/2.0);

}

BZOJ3707 圈地 計算幾何

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

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

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

bzoj 3232 圈地遊戲

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