最小生成樹 HAOI2006 聰明的猴子

2022-06-04 05:03:05 字數 2960 閱讀 2180

題目:[haoi2006]聰明的猴子

描述:在乙個熱帶雨林中生存著一群猴子,它們以樹上的果子為生。昨天下了一場大雨,現在雨過天晴,但整個雨林的地表還是被大水淹沒著,

猴子不會游泳,但跳躍能力比較強,它們仍然可以在露出水面的部分植物的樹冠上來回穿梭,以找到喜歡吃的果實。

現在,在這個地區露出水面的有n棵樹,假設每棵樹本身的直徑都很小,可以忽略不計。我們在這塊區域上建立直角座標系,則每一棵樹的位置由其所對應的座標表示(任意兩棵樹的座標都不相同)。

在這個地區住著的猴子有m個,下雨時,它們都躲到了茂密高大的樹冠中,沒有被大水沖走。由於各個猴子的年齡不同、身體素質不同,它們跳躍的能力不同。有的猴子跳躍的距離比較遠(當然也可以跳到較近的樹上),而有些猴子跳躍的距離就比較近。這些猴子非常聰明,它們通過目測就可以準確地判斷出自己能否跳到對面的樹上。

任務:現已知猴子的數量及每乙個猴子的最大跳躍的距離,還知道露出水面的每一棵樹的座標,你的任務是統計有多少猴子可以在這個地區露出水面的所有樹冠上覓食。

第一行乙個整數,表示猴子的個數 m(2<=m<=500)

第二行為m個整數,依次表示猴子的最大跳躍距離(每個整數值在1---1000之間)

第三行為乙個整數,表示樹的總棵樹n(2<=n<=1000)

第四行至第n+3行為n棵樹的座標(橫縱座標均為整數,範圍為:-1000--1000)

輸出只有一行,包括乙個整數,表示可以有這個地區的所有樹冠上覓食的猴子數。

41 2 3 4

60 0

1 01 2

-1 -1

-2 0

2 2

3

對於40%的資料,保證有2<=n<=100,1<=m<=100

對於100%的資料,保證有2<=n<=1000,1<=m<=500

題目很果,明顯的最小生成樹,按照座標計算距離,然後建樹即可。記得陣列不能開太小,還有就是因為忘了改變父親節點導致一直a不掉,鬱悶了半天,所以存個模版很重要啊!

ac**:

program zht;

vari,j,m,n,ans,s,hh:longint;

z:array[0..2000] of real;

c,c2:array[0..500000] of real;

a,b,a2,b2:array[0..500000] of longint;

t,bh,f,x,y:array[0..1000] of longint;

procedure gb(low,high:longint);

varq,w,e,mid,k:longint;

begin

if low=high then exit;

mid:=0;

mid:=(low+high) div 2;

gb(low,mid);

gb(mid+1,high);

q:=0;

w:=0;

e:=0;

q:=low;

w:=mid+1;

e:=low;

while (q<=mid) and (w<=high) do

if c[q]f[q] do

begin

inc(bh[0]);

bh[bh[0]]:=q;

q:=f[q];

end;

g:=0;

for g:=1 to bh[0] do

f[bh[g]]:=q;

fillchar(bh,sizeof(bh),0);

w:=b[k];

while w<>f[w] do

begin

inc(bh[0]);

bh[bh[0]]:=w;

w:=f[w];

end;

g:=0;

for g:=1 to bh[0] do

f[bh[g]]:=w; // 因為cogs的編譯器有問題,導致我的並查集只能這麼寫了~~~有點麻煩,路徑壓縮和查詢就是上面的幾段

if q=w then continue;

f[q]:=w;

inc(ss);

z[ss]:=c[k];

end;

end;

begin

assign(input,'monkey.in');

assign(output,'monkey.out');

reset(input);

rewrite(output);

readln(m);

for i:=1 to m do

read(t[i]);

readln(n);

for i:=1 to n do

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

for i:=1 to n-1 do

for j:=i+1 to n do

begin

inc(s);

a[s]:=i;

b[s]:=j;

c[s]:=sqrt((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]));

end; // 預處理距離

gb(1,s); // 排序

for i:=1 to n do

f[i]:=i;

maketree; // 建樹

for i:=1 to m do

begin

hh:=0;

for j:=1 to n-1 do

if z[j]>t[i] then begin hh:=1; break; end;

if hh=0 then inc(ans);

end;

writeln(ans); // 計算答案

close(input);

close(output);

end.

}

最小生成樹 HAOI2006 聰明的猴子

原題鏈結 haoi2006 聰明的猴子 給你 n 個數,代表最多可以走多長的邊權,再給你 m 個座標,每個座標給 x,y 兩個值,求在 n 中有多少值能夠走完 m 個這些座標 很水的一道題,只是熟悉下模板 就是座標兩兩連線,然後用最小生成樹亂搞一下 最小生成樹模板出錯改了乙個小時 quq defin...

HAOI2006 聰明的猴子

在乙個熱帶雨林中生存著一群猴子,它們以樹上的果子為生。昨天下了一場大雨,現在雨過天晴,但整個雨林的地表還是被大水淹沒著,部分植物的樹冠露在水面上。猴子不會游泳,但跳躍能力比較強,它們仍然可以在露出水面的不同樹冠上來回穿梭,以找到喜歡吃的果實。現在,在這個地區露出水面的有n棵樹,假設每棵樹本身的直徑都...

HAOI2006 聰明的猴子 題解

在乙個熱帶雨林中生存著一群猴子,它們以樹上的果子為生。昨天下了一場大雨,現在雨過天晴,但整個雨林的地表還是被大水淹沒著,部分植物的樹冠露在水面上。猴子不會游泳,但跳躍能力比較強,它們仍然可以在露出水面的不同樹冠上來回穿梭,以找到喜歡吃的果實。現在,在這個地區露出水面的有n棵樹,假設每棵樹本身的直徑都...