ZJOI 2008 瞭望塔 半平面交

2021-07-25 14:43:31 字數 1781 閱讀 8220

題意:

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