AcWing 238 銀河英雄傳說(帶權並查集)

2022-07-25 16:09:29 字數 1355 閱讀 1548

有乙個劃分為n列的星際戰場,各列依次編號為1,2,…,n。

有n艘戰艦,也依次編號為1,2,…,n,其中第i號戰艦處於第i列。

有t條指令,每條指令格式為以下兩種之一:

1、m i j,表示讓第i號戰艦所在列的全部戰艦保持原有順序,接在第j號戰艦所在列的尾部。

2、c i j,表示詢問第i號戰艦與第j號戰艦當前是否處於同一列中,如果在同一列中,它們之間間隔了多少艘戰艦。

現在需要你編寫乙個程式,處理一系列的指令。

輸入格式

第一行包含整數t,表示共有t條指令。

接下來t行,每行乙個指令,指令有兩種形式:m i j或c i j。

其中m和c為大寫字母表示指令型別,i和j為整數,表示指令涉及的戰艦編號。

輸出格式

你的程式應當依次對輸入的每一條指令進行分析和處理:

如果是m i j形式,則表示艦隊排列發生了變化,你的程式要注意到這一點,但是不要輸出任何資訊;

如果是c i j形式,你的程式要輸出一行,僅包含乙個整數,表示在同一列上,第i號戰艦與第j號戰艦之間布置的戰艦數目,如果第i號戰艦與第j號戰艦當前不在同一列上,則輸出-1。

資料範圍n≤

30000,t

≤500000

'>n≤30000,t≤500000

n≤30000,t≤500000

輸入樣例:

4

m 2 3

c 1 2

m 2 4

c 4 2

輸出樣例:
-1

1

演算法:帶權並查集

帶權並查集:普通的並查集是用乙個f陣列來記錄前乙個節點的位置,而帶權並查集還需要用乙個d陣列來記錄前面所以節點的總權值。

#include #include 

#include

using

namespace

std;

const

int maxn = 5e5+7

;int

f[maxn];

intd[maxn];

intsize[maxn];

int find(int

x)

int root =find(f[x]);

d[x] += d[f[x]]; //

更新當前節點x前面的戰艦數量

return f[x] =root;

}int

main()

intn;

scanf("%d

", &n);

while(n--)

} else

else}}

return0;

}

acwing 238 銀河英雄傳說(並查集)

題目位址 維護size和距離的並查集。用d i 表示i到父節點的距離。在合併的時候,a的祖宗到b的祖宗的距離就是b這個集合的size。我們只需要維護兩個祖宗之間的距離就行了。而a那個集合的子節點到b的祖宗節點的距離會在find函式裡面更新。求兩個點在不在同一列就是求是否在同乙個集合,它們之間隔的距離...

銀河英雄傳說

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

銀河英雄傳說

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