洛谷 1783 海灘防禦 題解

2021-10-01 04:35:04 字數 2385 閱讀 9777

部落格觀賞效果更佳

平面直角座標系上有m

(<

=800

)m(<=800)

m(<=8

00)個點,每個點的x

xx座標都在[1,

n]

[1,n]

[1,n

]之內,n

<

=1000

n<=1000

n<=1

000,y

yy座標<=1

e5

<=1e5

<=1

e5。每個點珂以設乙個半徑為r

rr的攻擊塔(攻擊範圍包含邊界)。x

xx軸上[1,

n]

[1,n]

[1,n

]的區域是敵人的進攻線,請你在每個位置都設定一些防禦塔,使得敵人無法在y

yy座標上無限增大(敵人珂以各種繞路),並且r

rr的最大值最小。

抽象成圖。邊權為兩個點之間的距離/2。設定起點s,s到乙個點的距離為這個點的x

xx座標。設定終點t,t到乙個點的距離為n-這個點的x

xx座標。從s到t跑最短路,路徑的長度定義為路徑上所有邊權的最大值。

如果我們的最大半徑為r

rr,那麼肯定每個點都要設定半徑r

rr。反正半徑又不花錢,那肯定往大里放啊。

然後對於乙個點u,v

u,vu,

v,設距離為d

dd。那麼,兩邊都設定半徑為d/2

d/2d/

2就能覆蓋u,v

u,vu,

v之間的部分了。

當然,我們的目的是封鎖y

yy軸。稍微轉化一下,就是要從左到右完美的封鎖出「一條」來。「一條」珂以是曲線,看起來還很粗,只要不空出來即珂。因為敵人走位隨便走,你只要一點空出來,敵人鑽過去,就珂以無限向y

yy軸延伸了。

所以,我們還要建立兩個點,表示左邊界和右邊界。就是上面說的s和t。要說幾何意義,就是s:直線x=0,t:直線x=n。然後s到乙個點顯然需要半徑為這個點的x座標值,才能封鎖這個點到s的範圍。t同理。

然後,對於我們從s到t,也就是從左到右,選擇的一條鏈上,乙個空位也不能有,也就是每個空都要完美的守住。所以這條鏈的長度就是最長邊的值。

這樣跑一遍最短路即珂。記得邊權是實數,而不是整數。

#include

using

namespace std;

namespace flandre_scarlet

ed[n*n<<1]

;void

clear

(int _v=n,

int _e=n<<1)

void

addedge

(int u,

int v,real w=

0.0)

; head[u]

=edgecount;

}void

add2

(int u,

int v,real w=1)

intstart

(int u)

intto

(int u)

real label

(int u)

intnext

(int u)

}g;voidr1(

int&x)

int n,m;

real x[n]

,y[n]

;void

input()

real d

(int dx,

int dy)

//求距離

struct node

;bool

operator

<

(node a,node b)

bool vis[n]

;real dis[n]

; priority_queue q;

void

dijkstra

(int s)

);dis[s]

=0.00

;while

(!q.

empty()

));}

}}}//dijkstra演算法(堆優化)

void

soviet()

//s和t的邊

f(i,

1,m)

f(j,

1,i-1)

//兩點之間的邊,邊權為距離/2

dijkstra

(s);

printf

("%.2f\n"

,dis[t]);

}#define flan void

flan ismywife()

}int

main()

題解 洛谷 1783 海灘防禦

題目描述 wlp同學最近迷上了一款網路聯機對戰遊戲 終於知道為毛johnkram每天刷洛谷效率那麼低了 但是他卻為了這個遊戲很苦惱,因為他在海邊的造船廠和倉庫總是被敵方派人偷襲。於是,wlp動用了他那豐滿且充實的大腦 或許更偏向前者 想出了乙個好主意,他把海灘分成垂直於海岸線的若干列,在其中的幾列上...

洛谷 P1783 海灘防禦

題目描述 wlp同學最近迷上了一款網路聯機對戰遊戲 終於知道為毛johnkram每天刷洛谷效率那麼低了 但是他卻為了這個遊戲很苦惱,因為他在海邊的造船廠和倉庫總是被敵方派人偷襲。於是,wlp動用了他那豐滿且充實的大腦 或許更偏向前者 想出了乙個好主意,他把海灘分成垂直於海岸線的若干列,在其中的幾列上...

P1783 海灘防禦 最短路

題意 題目的意思就是要建立一道防線,從x 0,鏈結到x n 題目會給出m個哨點,每個哨點可以包含半徑為k的範圍,通過這些哨點來建立防線 如圖,建立類似這樣的一條防線,那麼我們就是要從左邊建到右邊,找一條最短路 思路 假如我們單獨處理題目中給出的哨點的話,那麼兩岸還沒處理到,所以我們增加m 1 設立在...