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

2022-04-06 22:21:18 字數 2195 閱讀 5427

公元五八○一年,地球居民遷移至金牛座α第二行星,在那裡發表銀河聯邦

創立宣言,同年改元為宇宙歷元年,並開始向銀河系深處拓展。

宇宙歷七九九年,銀河系的兩大軍事集*在巴公尺利恩星域爆發戰爭。泰山壓

頂集**宇宙艦隊司令萊因哈特率領十萬餘艘戰艦出征,氣吞山河集*點名將楊

威利組織麾下三萬艘戰艦迎敵。

楊威利擅長排兵布陣,巧妙運用各種戰術屢次以少勝多,難免恣生驕氣。在

這次決戰中,他將巴公尺利恩星域戰場劃分成30000列,每列依次編號為1, 2, …,

30000。之後,他把自己的戰艦也依次編號為1, 2, …, 30000,讓第i號戰艦處於

第i列(i = 1, 2, …, 30000),形成「一字長蛇陣」,誘敵深入。這是初始陣形。當

進犯之敵到達時,楊威利會多次發布合併指令,將大部分戰艦集中在某幾列上,

實施密集攻擊。合併指令為m i j,含義為讓第i號戰艦所在的整個戰艦佇列,作

為乙個整體(頭在前尾在後)接至第j號戰艦所在的戰艦佇列的尾部。顯然戰艦

佇列是由處於同一列的乙個或多個戰艦組成的。合併指令的執行結果會使佇列增

大。 然而,老謀深算的萊因哈特早已在戰略上取得了主動。在交戰中,他可以通

過龐大的情報網路隨時監聽楊威利的艦隊調動指令。

在楊威利發布指令調動艦隊的同時,萊因哈特為了及時了解當前楊威利的戰

艦分布情況,也會發出一些詢問指令:c i j。該指令意思是,詢問電腦,楊威利

的第i號戰艦與第j號戰艦當前是否在同一列中,如果在同一列中,那麼它們之

間布置有多少戰艦。

作為乙個資深的高階程式設計員,你被要求編寫程式分析楊威利的指令,以

及回答萊因哈特的詢問。

最終的決戰已經展開,銀河的歷史又翻過了一頁……

輸入格式:

輸入檔案galaxy.in的第一行有乙個整數t(1<=t<=500,000),表示總共有t

條指令。

以下有t行,每行有一條指令。指令有兩種格式:

m i j :i和j是兩個整數(1<=i , j<=30000),表示指令涉及的戰艦編號。

該指令是萊因哈特竊聽到的楊威利發布的艦隊調動指令,並且保證第i號戰

艦與第j號戰艦不在同一列。

c i j :i和j是兩個整數(1<=i , j<=30000),表示指令涉及的戰艦編號。

該指令是萊因哈特發布的詢問指令。

輸出格式:

輸出檔案為galaxy.out。你的程式應當依次對輸入的每一條指令進行分析和

處理:如果是楊威利發布的艦隊調動指令,則表示艦隊排列發生了變化,你的程式

要注意到這一點,但是不要輸出任何資訊;

如果是萊因哈特發布的詢問指令,你的程式要輸出一行,僅包含乙個整數,

表示在同一列上,第i 號戰艦與第j 號戰艦之間布置的戰艦數目。如果第i 號戰

艦與第j號戰艦當前不在同一列上,則輸出-1。

輸入樣例#1:

4

m 2 3

c 1 2

m 2 4

c 4 2

輸出樣例#1:

-1

1

【樣例說明】

戰艦位置圖:**中阿拉伯數字表示戰艦編號

加權並查集。記錄下每艘船與最前面的船的距離。並且並查集判斷是不是在同一列上。

1 #include2 #include3 #include4

5using

namespace

std;

6const

int maxn = 30100;7

struct

nodes[maxn];

10char ch[5

];11

intt,n;

1213

int find(int

x)14

21return

s[x].fa;22}

23void change(int x,int

y)24

32void query(int x,int

y)33

39int

main()

4048

for (int i=1; i<=t; ++i)

4955

return0;

56 }

P1196 銀河英雄傳說

這題真的很經典,我wa了三次,最後一次才ac 因為這道題是很有技術含量的,能自己寫出來真的很厲害 不是在誇自己 如果只是粗略的去看題解或者抄題解 倒是可以用來矇騙自己 那這道題就失去意義了。下面的 每一句話,都是值得深刻推敲的。舉幾個例子 int find int x 這裡就不能直接寫par x f...

洛谷P1196 銀河英雄傳說

大意 你有30000個佇列,第i個佇列中只有i 有t個操作,1,把某個佇列頭接到另乙個佇列尾。2,問兩個元素之間的距離。本題主要有三種解法。帶權並查集。具體來說就是,並查集維護當前集合的大小,這個點距離代表元 隊首 的邊數。然後把合併和路徑壓縮魔改一下。詢問的時候就直接取距離之差。1 include...

洛谷 P1196 銀河英雄傳說

p1196 銀河英雄傳說 加權並查集,簡介見加權並查集,具體方法見 及注釋 p1196 銀河英雄傳說 includeint fa 30010 int r 30010 r i 表示第i號戰艦在其父親之後的第r i 個位置 int r2 30010 r2 i 表示以第i號戰艦為隊首的佇列有r2 i 輛戰...