題意:
給出乙個以n個點為輪廓的村莊,在村莊任意位置放乙個瞭望塔,使瞭望塔能看到村莊的所有位置,求瞭望塔最低高度。
思路:
考慮輪廓的每一條邊,要看到這條邊就必須在這條邊以上的乙個半平面內,因此求半平面交即可,樣例圖:
不妨將半平面交與地面上的直線看成分段函式,分別為f(x)與g(x),則所求即為h(x) = f(x) - g(x)的最小值,由於f(x)與g(x)均為一次分段函式,故h(x)也是一次分段函式,其最值僅可能在每一段的端點處取到。
注意:
1)輸入的座標為整數,注意轉為double
2)叉積代表有向面積,寫的時候要想清楚方向
由於是第一次寫半平面交,根據老人家的模板寫的,其實由於本題的特殊性可以寫得更簡單(例如直線可用斜截式),但這樣的寫法更具一般性,**:
#include #include #include #define for(i,j,k) for(int i = j;i <= k;i++)
#define dcmp(x) (x > eps ? 1 : (x < -eps ? -1 : 0))
using namespace std;
const int n = 310;
const double eps = 1e-8;
struct point
point(double x, double y):x(x), y(y){}
bool operator < (const point& a) const
};typedef point vector;
vector operator - (const point &a, const point &b)
point operator + (const point &a, const vector &v)
vector operator * (const vector &v, double k)
double cross(const vector &a, const vector &b)
struct line
line(const point& a, const point& b)
bool operator
};point intersection(line& a, line& b)
bool onleft(line& l, point& p)
int n, m;
line q[n], l[n];
point p[n], land[n];
void halfplaneintersection()
if(l < r) p[r-1] = intersection(q[r-1], q[r]);
}while(l < r && !onleft(q[l], p[r-1])) r--;
p[r] = intersection(q[r], q[l]);
for(i,l,r) p[i - l + 1] = p[i];
m = r - l + 1;
}int x[n], y[n];
int main()
for(j,1,m)
for(i,1,n-1)
if(dcmp(p[j].x - x[i]) >= 0 && dcmp(p[j].x - x[i+1]) <= 0)
printf("%.3lf\n", ans);
return 0;
}
ZJOI2008 瞭望塔 半平面交
題意 給出乙個以n個點為輪廓的村莊,在村莊任意位置放乙個瞭望塔,使瞭望塔能看到村莊的所有位置,求瞭望塔最低高度。只我們發現只有這個點在每個直線所在半平面以上的時候才能看到,如樣例圖 還注意到,只有在原圖的端點或半平面交的端點處才會更新答案。include include include includ...
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 間的任意位置,但必須滿足...