題意:給出乙個以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 間的任意位置,但必須滿足...