方塊遊戲 (銀河英雄傳說)(並查集)

2021-07-24 13:33:48 字數 1895 閱讀 4554

方塊遊戲

(cubes.pas/c/cpp)

【題目描述】

小a和小b在玩乙個方塊遊戲。編號為1到n(1<=n<=30000)的n個方塊正放在地上。每個構成乙個立方柱。

遊戲開始後,小a會給小b發出p(1<=p<=100000)個指令。

1、移動(m):將包含x的立方柱移動到包含y的立方柱上。

2、統計(c):統計含x的立方柱中,在x下方的方塊數目。

寫個程式幫小b完成遊戲。

【輸入資料】

第1行輸入p,之後p行每行輸入一條指令。形式為「m x y」或者「c x」。

輸入保證不會有將立方柱放在自己頭上的指令。

【輸出資料】

每一行,對於每個統計指令,輸出其結果。

【樣例輸入】

6 m 1 6

c 1

m 2 4

m 2 6

c 3

c 4

【樣例輸出】

1 0

2 【資料範圍】

對於40%的資料,n,p≤200。

對於60%的資料,n,p≤2000。

對於100%的資料,n,p≤100000。

是模擬賽考到的一道題,和刷過的「銀河英雄傳說」(wikioi 1540)基本一致,我本來以為我會了,沒想到還是糾結了很長時間,於是重新收錄一下這道題。

(銀河英雄傳說:

用並查集記錄每個方塊的最後一次被更新時指向的父親節點,在詢問時進行更新。

因為上一次被記錄的時候,父親節點一定是當時最下面的方塊,所以父親節點下面增加的方塊數量也是該節點下面增加方塊的數量,在find函式中加入該操作即可。

program mys;

var i,k,x,y,rx,ry,p:longint;

f,d,sum:array[0..60000]of longint;

ch:char;

function

find

(x:longint):longint;

var t,y:longint;

begin

if f[x]<>x then

begin

t:=f[x];

f[x]:=find(f[x]);

d[x]:=d[x]+d[t];

end;

exit(f[x]);

end;

begin

assign(input,'cubes.in'); reset(input);

assign(output,'cubes.out'); rewrite(output);

readln(p);

for i:=1

to30000

dobegin

f[i]:=i; d[i]:=0; sum[i]:=1;

end;

for i:=1

to p do

begin

read(ch);

if ch='m'

then

read(x,y)

else

read(x);

readln;

if ch='m'

then

begin

rx:=find(x);

ry:=find(y);

f[rx]:=ry;

d[rx]:=sum[ry];

sum[ry]:=sum[ry]+sum[rx];

endelse

begin

rx:=find(x);

writeln(d[x]);

end;

end;

close(input);

close(output);

end.

並查集 銀河英雄傳說

description 公元五八 一年,地球居民遷移至金牛座 第二行星,在那裡發表銀河聯邦創立宣言,同年改元為宇宙歷元年,並開始向銀河系深處拓展。宇宙歷七九九年,銀河系的兩大軍事集團在巴公尺利恩星域爆發戰爭。泰山壓頂集團派宇宙艦隊司令萊因哈特率領十萬餘艘戰艦出征,氣吞山河集團點名將楊威利組織麾下三萬...

並查集 銀河英雄傳說

2002年noi全國競賽 時間限制 1 s 空間限制 256000 kb 題目等級 大師 master 公元五八 一年,地球居民遷移至金牛座 第二行星,在那裡發表銀河聯邦創立宣言,同年改元為宇宙歷元年,並開始向銀河系深處拓展。宇宙歷七九九年,銀河系的兩大軍事集 在巴公尺利恩星域爆發戰爭。泰山壓頂集 ...

銀河英雄傳說(並查集操作)

p1196 noi2002 銀河英雄傳說 鏈結戳這裡 銀河英雄傳說 先不說什麼,直接上 吧!include include include include using namespace std struct sdnode 300003 int njc int n int father int v ...