jzoj 1916 2011集訓隊出題 飛飛俠

2021-08-14 03:27:05 字數 3793 閱讀 6732

description

飛飛國是乙個傳說中的國度,國家的居民叫做飛飛俠。飛飛國是乙個n×m的矩形方陣,每個格仔代表乙個街區。

然而飛飛國是沒有交通工具的。飛飛俠完全靠地面的彈射裝置來移動。

每個街區都裝有彈射裝置。使用彈射裝置是需要支付一定費用的。而且每個彈射裝置都有自己的彈射能力。

我們設第i行第j列的彈射裝置有aij的費用和bij的彈射能力。並規定有相鄰邊的格仔間距離是1。那麼,任何飛飛俠都只需要在(i,j)支付aij的費用就可以任意選擇彈到距離不超過bij的位置了。如下圖

(從紅色街區交費以後可以跳到周圍的任意藍色街區。)

現在的問題很簡單。有三個飛飛俠,分別叫做x,y,z。現在它們決定聚在一起玩,於是想往其中一人的位置集合。告訴你3個飛飛俠的座標,求往**集合大家需要花的費用總和最低。

input

輸入的第一行包含兩個整數n和m,分別表示行數和列數。

接下來是2個n×m的自然數矩陣,為bij和aij

最後一行六個數,分別代表x,y,z所在地的行號和列號。

output

第一行輸出乙個字元x、y或者z。表示最優集合地點。

第二行輸出乙個整數,表示最小費用。

如果無法集合,只輸出一行no

sample input

4 4

0 0 0 0

1 2 2 0

0 2 2 1

0 0 0 0

5 5 5 5

5 5 5 5

5 5 5 5

5 5 5 5

2 1 3 4 2 2

sample output

z 15

data constraint

hint

【資料範圍】

20% n, m ≤ 10; bij ≤ 20

40% n, m ≤ 100; bij ≤ 20

100% 1 ≤ n, m ≤ 150; 0 ≤ bij ≤ 10^9; 0 ≤ aij ≤ 1000

分析:暴力spfa,連邊會爆,顯然可以帶著座標跑……

**:

const

maxn=150;

maxv=maxn*maxn;

ymw=100000000000000;

type

node=record

x,y:longint;

end;

var a,b:array [1..maxn,1..maxn] of int64;

n,m,i,h,t,j:longint;

ans:int64;

x,y:array [1..3] of longint;

dis:array [0..maxn,0..maxn] of int64;

v:array [1..maxn,1..maxn] of boolean;

list:array [1..maxv] of node;

s:array [1..3,1..3] of int64;

ch:char;

procedure

init;

var i,j:longint;

begin

readln(n,m);

for i:=1

to n do

for j:=1

to m do

read(a[i,j]);

for i:=1

to n do

for j:=1

to m do

read(b[i,j]);

for i:=1to3

doread(x[i],y[i]);

end;

function

max(x,y:longint):longint;

begin

if x>y then

exit(x)

else

exit(y);

end;

function

min(x,y:longint):longint;

begin

if xthen

exit(x)

else

exit(y);

end;

procedure

spfa

(xx,yy:longint);

var x,y,i,j:longint;

begin

for i:=1

to n do

for j:=1

to m do

begin

dis[i,j]:=ymw;

v[i,j]:=false;

list[(i-1)*m+j].x:=0;

list[(i-1)*m+j].y:=0;

end;

h:=0; t:=1;

list[t].x:=xx; list[t].y:=yy;

dis[xx,yy]:=0;

v[xx,yy]:=true;

repeat

h:=h mod maxv+1;

x:=list[h].x;

y:=list[h].y;

for i:=max(1,x-a[x,y]) to min(n,x+a[x,y]) do

for j:=max(1,y-a[x,y]+abs(x-i)) to min(m,y+a[x,y]-abs(x-i)) do

if (dis[i,j]>dis[x,y]+b[x,y]) then

begin

dis[i,j]:=dis[x,y]+b[x,y];

if v[i,j]=false

then

begin

t:=t mod maxv+1;

list[t].x:=i;

list[t].y:=j;

v[i,j]:=true;

end;

end;

v[x,y]:=false;

until h=t;

end;

begin

init;

for i:=1to3

dobegin

spfa(x[i],y[i]);

for j:=1to3

do s[i,j]:=dis[x[j],y[j]];

end;

ans:=maxlongint;

if (s[2,1]<>ymw) and (s[3,1]<>ymw) then

begin

ch:='x';

ans:=s[2,1]+s[3,1];

end;

if (s[1,2]<>ymw) and (s[3,2]<>ymw)

and (s[1,2]+s[3,2]then

begin

ch:='y';

ans:=s[1,2]+s[3,2];

end;

if (s[1,3]<>ymw) and (s[2,3]<>ymw)

and (s[1,3]+s[2,3]then

begin

ch:='z';

ans:=s[1,3]+s[2,3];

end;

if ans=maxlongint then

begin writeln('no'); exit; end

else

begin

writeln(ch);

writeln(ans);

end;

end.

JZOJ1914 2011集訓隊出題 最短路

給乙個n個點m條邊的連通無向圖,滿足每條邊最多屬於乙個環,有q組詢問,每次詢問兩點之間的最短路徑。n 10000,q 10000。這道圖的題目可以思考如何用樹上的做法來解決這道題。在簡潔的題目裡得出了乙個極為重要的資訊每個點只會出現在乙個環中。首先當然是先跑一遍dij,處理出從編號為1的點到各個點的...

2011集訓隊出題 拆遷隊

lanxisi帶領著他的拆遷隊來整治乙個街道。這個街道由n個舊房子組成,從左到右編號為1.n。每個舊房子i有乙個正整數的美觀度ai。lanxisi希望整個街道從左到右美觀度嚴格遞增,也就是保證ai i。但是舊的街道明顯不符合這個要求,於是lanxisi希望拆遷一些舊房子並在原地建立新房子來滿足這一要...

2011集訓隊出題 happiness

高一一班的座位表是個n m的矩陣,經過乙個學期的相處,每個同學和前後左右相鄰的同學互相成為了好朋友。這學期要分文理科了,每個同學對於選擇文科與理科有著自己的喜悅值,而一對好朋友如果能同時選文科或者理科,那麼他們又將收穫一些喜悅值。作為計算機競賽教練的scp大老闆,想知道如何分配可以使得全班的喜悅值總...