邊帶權並查集 尾並 銀河英雄傳說

2021-09-23 01:43:04 字數 1361 閱讀 1884

有乙個劃分為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

輸入樣例:

4m 2 3

c 1 2

m 2 4

c 4 2

輸出樣例:-11

這是一道邊帶權並查集。

用size記錄集合的大小,用d記錄每乙個點到頂點的距離。

本題是尾部拼接。就是把a所在的集合的頂點,加到b所在的尾部,也就是將b的集合的大小加上a集合的大小,然後把a的頂點的d陣列更新成b集合的大小,即可。

帶權邊並查集模版 (這是中間點插入的模版。)

int find(int x)

return parent[x];

}

int px = find(x);

int py = find(y);

if (px != py)

本題**

#includeusing namespace std;

const int maxn = 30001;

int f[maxn],w[maxn],size[maxn]; //記錄集合大小的陣列

void init()

}int find(int x)

return f[x];

}void union(int a, int b)

}int main () else if (c == 'c') else }}

return 0;

}

一篇不錯的講解邊帶權的文章

並查集 銀河英雄傳說

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

並查集 銀河英雄傳說

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

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

題目鏈結 題目描述是中文,不再多說 本題目主要是採用帶權並查集的方法去記錄權值,用三個陣列實現 root 陣列儲存根節點 size 陣列儲存當前根節點的最大長度 d 陣列儲存當前位置到根節點的距離 在查詢的 a 到 b 的時候,如果 a b 在同乙個集合,輸出 a b 到根節點的距離的差的絕對值減一...