洛谷 1196 銀河英雄傳說 並查集

2021-07-26 04:32:31 字數 1452 閱讀 6071

題目描述:

楊威利擅長排兵布陣,巧妙運用各種戰術屢次以少勝多,難免恣生驕氣。在這次決戰中,他將巴公尺利恩星域戰場劃分成30000列,每列依次編號為1, 2, …,30000。之後,他把自己的戰艦也依次編號為1, 2, …, 30000,讓第i號戰艦處於第i列(i = 1, 2, …, 30000),形成「一字長蛇陣」,誘敵深入。這是初始陣形。當進犯之敵到達時,楊威利會多次發布合併指令,將大部分戰艦集中在某幾列上,實施密集攻擊。合併指令為m i j,含義為讓第i號戰艦所在的整個戰艦佇列,作為乙個整體(頭在前尾在後)接至第j號戰艦所在的戰艦佇列的尾部。顯然戰艦佇列是由處於同一列的乙個或多個戰艦組成的。合併指令的執行結果會使佇列增大。 然而,老謀深算的萊因哈特(這絕對與ow無關)早已在戰略上取得了主動。在交戰中,他可以通過龐大的情報網路隨時監聽楊威利的艦隊調動指令。在楊威利發布指令調動艦隊的同時,萊因哈特為了及時了解當前楊威利的戰艦分布情況,也會發出一些詢問指令: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。

輸入樣例:

4m 2 3

c 1 2

m 2 4

c 4 2

輸出樣例:-11

解題思路:

並查集,設b,c陣列,b[i]表示第i艘飛船前有多少艘,c[i]表示第i艘後有幾艘。合併時,如把i接到j後 b[i]=c[j];c[j]=c[j]+c[i]

**:#include#include#include#includeusing namespace std;int m,i,j,n,tot;int f[300000],c[300000],b[300000];int getfather(int x)void me(int x,int y)void ask(int x,int y) else printf("-1\n"); }int main() for(int i=1;i<=n;i++) return 0; }

銀河英雄傳說 洛谷1196 並查集

有點有趣的並查集問題,類似於食物鏈而略簡單 使用sum i 表示以i為祖先的並查集的元素個數 不包含i 以dis i 表示i到其祖先的距離,每次getfather時根據x的直接父親來更新x的dis值,每次修改操作時用sum y 更新dis x 用sum x 更新sum y 最後輸出時直接利用兩個點的...

銀河英雄傳說 洛谷1196 並查集

有點有趣的並查集問題,類似於食物鏈而略簡單 使用sum i 表示以i為祖先的並查集的元素個數 不包含i 以dis i 表示i到其祖先的距離,每次getfather時根據x的直接父親來更新x的dis值,每次修改操作時用sum y 更新dis x 用sum x 更新sum y 最後輸出時直接利用兩個點的...

洛谷 1196 銀河英雄傳說

傳送門 寫題一時wa了時間不多了計畫還沒完成先放下去寫道水題好像是正確的選擇。對每個點記錄它到當前代表元的距離,初始都為0 到自己 合併時之前代表元的距離就等於它要合併的那個集合的size。路徑壓縮時先加上父親到代表元的距離,再把父親換成代表元。twenty include include incl...