【題目】
公元五八○一年,地球居民遷移至金牛座α第二行星,在那裡發表銀河聯邦創立宣言,同年改元為宇宙歷元年,並開始向銀河系深處拓展。
宇宙歷七九九年,銀河系的兩大軍事集*在巴公尺利恩星域爆發戰爭。泰山壓頂集**宇宙艦隊司令萊因哈特率領十萬餘艘戰艦出征,氣吞山河集*點名將楊威利組織麾下三萬艘戰艦迎敵。
楊威利擅長排兵布陣,巧妙運用各種戰術屢次以少勝多,難免恣生驕氣。在這次決戰中,他將巴公尺利恩星域戰場劃分成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行,每行有一條指令。指令有兩種格式:
1. m i j :i和j是兩個整數(1<=i , j<=30000),表示指令涉及的戰艦編號。該指令是萊因哈特竊聽到的楊威利發布的艦隊調動指令,並且保證第i號戰艦與第j號戰艦不在同一列。
2. 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
【分析】
顯然的並查集,加入了到根節點的長度的記錄。
count[i]代表i的集合中有幾個點。before[i]代表i之前有幾個點。
恩,程式很好明白。
#include #include #define maxn 30010int root[maxn],before[maxn],count[maxn];
int n,x,y;
char c;
int froot(int x)
void merge(int x,int y)
int main()
//exit
return 0;
}
合併兩個排序的陣列
includeusing namespace std 有兩個排序的陣列a1和a2,內存在a1的末尾有足夠多的空餘空間容納a2.實現乙個函式,把a2中的所有數字插入到a 中並且所有的數字是排序的。思路 先計算出兩個陣列中元素的總個數,然後從尾到頭比較array1和array2中的數字,並把較大的數字複...
合併兩個有序的陣列
給定兩個有序整數陣列 nums1 和 nums2,將 nums2 合併到 nums1 中,使得 num1 成為乙個有序陣列。說明 初始化 nums1 和 nums2 的元素數量分別為 m 和 n。你可以假設 nums1 有足夠的空間 空間大小大於或等於 m n 來儲存 nums2 中的元素。示例 輸...
合併兩個已有序的陣列
比較簡單 對有序陣列a,b,求a,b組成的有序陣列arr 1 a中最大 b 最小,先拷貝a至arr,再拷貝b,至arr。2 b中最大 a中最小,先拷貝b至arr,再拷貝a至arr。3 無1,2極端情況,依次取a,b首元素比較,將較小者放入arr。注意考慮a,b陣列長度不相等時,長度更長者未能遍歷完的...