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

2022-09-10 00:12:31 字數 1893 閱讀 1575

比較特殊的維護半平面交下凸殼。

luogu2600

致力於建設全國示範和諧小村莊的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:複製

6

1 2 4 5 6 7

1 2 2 4 2 1

輸出樣例#1:複製

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

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

由於只有一條路線以上的部分才能看過來,那麼就是乙個半平面交。這道題比較特殊,所有的都是直線,類似於bzoj1007,維護下凸殼。可以考慮到最後的答案要麼是在凸殼交點或者路的交點處。

我們把所有直線提出來。先按照斜率排序,同斜率按照截距排序。

然後如果一條直線和另一條直線斜率相同顯然選截距更大的,而如果斜率更大的直線於上上條直線交點前於斜率更小的直線交點前,那麼後一條直線也沒用。這樣考慮完之後就求出了半平面交下凸殼。

//維護下凸殼,類同bzoj1007

#include#include#include#includeusing namespace std;

typedef double db;

const db eps = 1e-8;

const int maxn = 605;

struct ptz[maxn];

pt operator+(pt a,pt b) ; }

pt operator-(pt a,pt b) ; }

pt operator*(db k,pt a) ; }

db operator*(pt a,pt b)

db operator^(pt a,pt b)

bool operator

break;

} st[++tot] = aa;

}db getup(db x)

return oo;

}db getdown(db x) )-z;

if(p==n+1||p==1) return -1e18;

line tt = getline(z[p],z[p-1]);

return tt.k*x+tt.b;

}int main()

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

for(int i=1;i

int oo = n-1;

sort(orz+1,orz+1+oo);

for(int i=1;i<=oo;i++) cut(orz[i]);

db ans = 1e17;

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

for(int i=1;i

printf("%.3lf",ans);

}

ZJOI 2008 瞭望塔 半平面交

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

ZJOI2008 瞭望塔 半平面交

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

P2600 ZJOI2008 瞭望塔 半平面交

致力於建設全國示範和諧小村莊的h村村長dadzhi,決定在村中建立乙個瞭望塔,以此加強村中的治安。我們將h村抽象為一維的輪廓。如下圖所示 我們可以用一條山的上方輪廓折線 x1,y1 x2,y2 xn,yn 來描述h村的形狀,這裡x1 x2 xn。瞭望塔可以建造在 x1,xn 間的任意位置,但必須滿足...