P2600 ZJOI2008 瞭望塔 半平面交

2022-05-02 06:12:07 字數 2580 閱讀 8750

致力於建設全國示範和諧小村莊的h村村長dadzhi,決定在村中建立乙個瞭望塔,以此加強村中的治安。

我們將h村抽象為一維的輪廓。如下圖所示

我們可以用一條山的上方輪廓折線(x1, y1), (x2, y2), …. (xn, yn)來描述h村的形狀,這裡x1 < x2 < …< xn。瞭望塔可以建造在[x1, xn]間的任意位置, 但必須滿足從瞭望塔的頂端可以看到h村的任意位置。可見在不同的位置建造瞭望塔,所需要建造的高度是不同的。為了節省開支,dadzhi村長希望建造的塔高度盡可能小。

請你寫乙個程式,幫助dadzhi村長計算塔的最小高度。

輸入檔案tower.in第一行包含乙個整數n,表示輪廓折線的節點數目。接下來第一行n個整數, 為x1 ~ xn. 第三行n個整數,為y1 ~ yn。

輸出檔案tower.out僅包含乙個實數,為塔的最小高度,精確到小數點後三位。

輸入 #1

61 2 4 5 6 7

1 2 2 4 2 1

輸出 #1

1.000

對於60%的資料, n ≤ 60;

對於100%的資料, n ≤ 300,輸入座標絕對值不超過106,注意考慮實數誤差帶來的問題。

題解

先做一遍半平面交,由於必定是無界的,我在左右和上側各加了乙個半平面(做完之後把不需要的邊界去掉)。

這樣我們就得到了乙個下凸殼,如果瞭望塔建在x

0'>x0

這個位置,那麼必定是建到直線x=x

0'>x=x

與這個凸殼的交點的高度即可。然後考慮到高度是由上下共同決定的,經過顯而易見的貪心,x0

'>x=x

0'>可以發現瞭望塔的橫座標要麼是這個凸殼上的頂點,要麼是下方輪廓線的端點,o(n

)'>o(n)

掃一遍即可。總複雜度o(n

log⁡n)

'>o(nlogn)

#include//

半平面交

#define ll long long

using

namespace

std;

const

double m =1e15;

const

int n = 1010

;struct

p s[n], p[n];

int cnt = 0

;struct

l t[n], q[n];

p operator-(p a, p b)

double

operator*(p a, p b)

double ans =1e15;

bool

operator

p inter(l a, l b)

double

dist(l a, p b)

bool

check(l a, l b, l c)

void

fun()

cnt =tot;

q[++r] = t[1], q[++r] = t[2

];

for (int i = 3; i <= cnt; i++)

while (l < r && check(q[r - 1], q[r], q[l]))r--;

while (l < r && check(q[l + 1], q[l], q[r]))l++;

q[r + 1] =q[l];

cnt = 0

;

for (int i = l; i <= r; i++)

}bool

cmp(p a, p b)

intmain() , t[cnt].b = ;

t[cnt].val = atan2(-m, 0

); t[++cnt].a = , t[cnt].b =;

t[cnt].val = atan2(m, 0

); t[++cnt].a = , t[cnt].b = ;

t[cnt].val = atan2(0, -m);

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

fun();

sort(p + 1, p + 1 +cnt, cmp);

int tot = 0

;

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

cnt =tot;

int i = 1, j = 1

; p[

0].x = p[1].x - 1

; p[

0].y = p[1].y;//

避免第乙個不相等的情況

while (i <= cnt && j <=n)

else

if (p[i].x

else

if (p[i].x >s[j].x)

}cout

<< fixed

<< setprecision(3) << ans <

return0;

}

ZJOI 2008 瞭望塔 半平面交

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

ZJOI2008 瞭望塔 半平面交

題意 給出乙個以n個點為輪廓的村莊,在村莊任意位置放乙個瞭望塔,使瞭望塔能看到村莊的所有位置,求瞭望塔最低高度。只我們發現只有這個點在每個直線所在半平面以上的時候才能看到,如樣例圖 還注意到,只有在原圖的端點或半平面交的端點處才會更新答案。include include include includ...

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

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