致力於建設全國示範和諧小村莊的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
logn)
'>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。瞭望...