ZJOI2008 瞭望塔 半平面交

2021-07-26 17:00:21 字數 1500 閱讀 6047

題意:給出乙個以n個點為輪廓的村莊,在村莊任意位置放乙個瞭望塔,使瞭望塔能看到村莊的所有位置,求瞭望塔最低高度。

只我們發現只有這個點在每個直線所在半平面以上的時候才能看到,如樣例圖:

還注意到,只有在原圖的端點或半平面交的端點處才會更新答案。

#include

#include

#include

#include

using namespace std;

const double esp=1e-8;

const int maxn=310;

int n,m;

int dcmp(double x)

struct point

point(double x,double y):x(x),y(y){}

bool operator

};typedef point vector;

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

point operator +(const point& a,const vector& b)

vector operator *(const vector& a,const double& b)

double cross(vector a,vector b)

struct line

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

bool operator

point p[maxn],land[maxn];

line q[maxn],l[maxn];

point getintersection(line a,line b)

void halfplaneintersection()

if(l1]=getintersection(q[r-1],q[r]);

}while(lq[l],p[r-1])) r--;

p[r]=getintersection(q[r],q[l]);

for(int i=l;i<=r;i++) q[i-l+1]=q[i];

m=r-l+1;

}int

x[maxn],y[maxn];

int main();

halfplaneintersection();

sort(p+1,p+1+m);

double ans=1e12;

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

for(int j=1;j

}for(int j=1;j<=m;j++)

for(int i=1;iif(dcmp(p[j].x-x[i])>=0 && dcmp(p[j].x-x[i+1])<=0)

}printf("%.3lf",ans);

return

0;}

ZJOI 2008 瞭望塔 半平面交

題意 給出乙個以n個點為輪廓的村莊,在村莊任意位置放乙個瞭望塔,使瞭望塔能看到村莊的所有位置,求瞭望塔最低高度。思路 考慮輪廓的每一條邊,要看到這條邊就必須在這條邊以上的乙個半平面內,因此求半平面交即可,樣例圖 不妨將半平面交與地面上的直線看成分段函式,分別為f x 與g x 則所求即為h x f ...

ZJOI2008 瞭望塔 維護半平面交交線

比較特殊的維護半平面交下凸殼。luogu2600 致力於建設全國示範和諧小村莊的h村村長dadzhi,決定在村中建立乙個瞭望塔,以此加強村中的治安。我們將h村抽象為一維的輪廓。如下圖所示 我們可以用一條山的上方輪廓折線 x1,y1 x2,y2 xn,yn 來描述h村的形狀,這裡x1 x2 xn。瞭望...

P2600 ZJOI2008 瞭望塔 半平面交

致力於建設全國示範和諧小村莊的h村村長dadzhi,決定在村中建立乙個瞭望塔,以此加強村中的治安。我們將h村抽象為一維的輪廓。如下圖所示 我們可以用一條山的上方輪廓折線 x1,y1 x2,y2 xn,yn 來描述h村的形狀,這裡x1 x2 xn。瞭望塔可以建造在 x1,xn 間的任意位置,但必須滿足...