日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

【BZOJ】【1038】【ZJOI2008】瞭望塔

發(fā)布時(shí)間:2024/4/17 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【BZOJ】【1038】【ZJOI2008】瞭望塔 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

計(jì)算幾何/半平面交


  說是半平面交,實(shí)際上只是維護(hù)了個(gè)下凸殼而已……同1007水平可見直線

  對(duì)于每條線段,能看到這條線段的點(diǎn)都在這條線段的“上方”,那么對(duì)所有n-1條線段求一個(gè)可視區(qū)域的交,就是求一個(gè)半平面交……(好扯)

  一開始我想的是:直接找到這個(gè)下凸殼的最低點(diǎn),它的y值就是答案辣~但是明顯不對(duì)>_>這題讓求的是塔的最低高度……不光要考慮塔頂,還要看塔底的啊!

  那么我們?cè)趺凑夷?#xff1f;我們可以發(fā)現(xiàn):隨著x的變化,塔高(就是地面到凸殼的豎直距離,y坐標(biāo)之差)是一個(gè)分段函數(shù),分段點(diǎn)就是地面的折點(diǎn)以及凸殼的頂點(diǎn)!而且在每一段里面,塔高的值是一個(gè)一次函數(shù)!經(jīng)過大膽猜想,小(bu)心(yong)證明我們發(fā)現(xiàn):分段一次函數(shù)的極值在分段點(diǎn)和邊界點(diǎn)處取到。

  那么就是對(duì)這些點(diǎn)算一下答案就可以了……點(diǎn)數(shù)是O(n)的……

1 /************************************************************** 2 Problem: 1038 3 User: Tunix 4 Language: C++ 5 Result: Accepted 6 Time:0 ms 7 Memory:1292 kb 8 ****************************************************************/ 9 10 //BZOJ 1038 11 #include<cmath> 12 #include<vector> 13 #include<cstdio> 14 #include<cstring> 15 #include<cstdlib> 16 #include<iostream> 17 #include<algorithm> 18 #define rep(i,n) for(int i=0;i<n;++i) 19 #define F(i,j,n) for(int i=j;i<=n;++i) 20 #define D(i,j,n) for(int i=j;i>=n;--i) 21 #define pb push_back 22 using namespace std; 23 inline int getint(){ 24 int v=0,sign=1; char ch=getchar(); 25 while(ch<'0'||ch>'9'){ if (ch=='-') sign=-1; ch=getchar();} 26 while(ch>='0'&&ch<='9'){ v=v*10+ch-'0'; ch=getchar();} 27 return v*sign; 28 } 29 const int N=310,INF=~0u>>2; 30 typedef long long LL; 31 typedef double lf; 32 const lf eps=1e-8; 33 /******************tamplate*********************/ 34 struct Point{ 35 lf x,y; 36 void read(){scanf("%lf%lf",&x,&y);} 37 }p[N]; 38 struct Line{double k,b;}l[N],st[N]; 39 Line make_line(Point a,Point b){ 40 Line tmp; 41 tmp.k=(a.y-b.y)/(a.x-b.x); 42 tmp.b=a.y-tmp.k*a.x; 43 return tmp; 44 } 45 int n,top; 46 inline bool cmp(Line a,Line b){ 47 if (fabs(a.k-b.k)<eps) return a.b<b.b; 48 return a.k<b.k; 49 } 50 double crossx(Line x1,Line x2){ 51 return (x2.b-x1.b)/(x1.k-x2.k); 52 } 53 void insert(Line a){ 54 while(top){ 55 if (fabs(st[top].k-a.k)<eps) top--; 56 else if (top>1 && crossx(a,st[top-1])<= 57 crossx(st[top],st[top-1])) top--; 58 else break; 59 } 60 st[++top]=a; 61 } 62 lf Up(lf x){ 63 lf ans=0.0; 64 F(i,1,top) 65 ans=max(ans,st[i].k*x+st[i].b); 66 return ans; 67 } 68 lf Down(lf x){ 69 int pos; 70 for(pos=1;pos<n && p[pos+1].x<x;pos++); 71 if (pos==n) return -1e10; 72 Line tmp=make_line(p[pos],p[pos+1]); 73 return tmp.k*x+tmp.b; 74 } 75 76 int main(){ 77 #ifndef ONLINE_JUDGE 78 freopen("1038.in","r",stdin); 79 freopen("1038.out","w",stdout); 80 #endif 81 n=getint(); 82 F(i,1,n) scanf("%lf",&p[i].x); 83 F(i,1,n) scanf("%lf",&p[i].y); 84 F(i,1,n-1) l[i]=make_line(p[i+1],p[i]); 85 sort(l+1,l+n,cmp); 86 F(i,1,n-1) insert(l[i]); 87 lf ans=1e10; 88 F(i,1,n) ans=min(ans,Up(p[i].x)-p[i].y); 89 F(i,2,top){ 90 Point p; 91 p.x=crossx(st[i-1],st[i]); 92 p.y=st[i].k*p.x+st[i].b; 93 ans=min(ans,p.y-Down(p.x)); 94 } 95 printf("%.3lf\n",ans); 96 return 0; 97 } View Code

?

1038: [ZJOI2008]瞭望塔

Time Limit: 10 Sec??Memory Limit: 162 MB
Submit: 1043??Solved: 470
[Submit][Status][Discuss]

Description

致 力于建設(shè)全國(guó)示范和諧小村莊的H村村長(zhǎng)dadzhi,決定在村中建立一個(gè)瞭望塔,以此加強(qiáng)村中的治安。我們將H村抽象為一維的輪廓。如下圖所示 我們可以用一條山的上方輪廓折線(x1, y1), (x2, y2), …. (xn, yn)來描述H村的形狀,這里x1 < x2 < …< xn。瞭望塔可以建造在[x1, xn]間的任意位置, 但必須滿足從瞭望塔的頂端可以看到H村的任意位置??梢娫诓煌奈恢媒ㄔ觳t望塔,所需要建造的高度是不同的。為了節(jié)省開支,dadzhi村長(zhǎng)希望建造的塔 高度盡可能小。請(qǐng)你寫一個(gè)程序,幫助dadzhi村長(zhǎng)計(jì)算塔的最小高度。

Input

第一行包含一個(gè)整數(shù)n,表示輪廓折線的節(jié)點(diǎn)數(shù)目。接下來第一行n個(gè)整數(shù), 為x1 ~ xn. 第三行n個(gè)整數(shù),為y1 ~ yn。

Output

僅包含一個(gè)實(shí)數(shù),為塔的最小高度,精確到小數(shù)點(diǎn)后三位。

Sample Input

【輸入樣例一】
6
1 2 4 5 6 7
1 2 2 4 2 1
【輸入樣例二】
4
10 20 49 59
0 10 10 0

Sample Output

【輸出樣例一】
1.000
【輸出樣例二】
14.500

HINT

對(duì)于100%的數(shù)據(jù), N ≤ 300,輸入坐標(biāo)絕對(duì)值不超過106,注意考慮實(shí)數(shù)誤差帶來的問題。

Source

[Submit][Status][Discuss]

轉(zhuǎn)載于:https://www.cnblogs.com/Tunix/p/4426259.html

總結(jié)

以上是生活随笔為你收集整理的【BZOJ】【1038】【ZJOI2008】瞭望塔的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。