NOI2002 銀河英雄傳說

2022-07-01 11:33:10 字數 1847 閱讀 6361

公元 580158015801 年,地球居民遷至金牛座 α\alphaα 第二行星,在那裡發表銀河聯邦創立宣言,同年改元為宇宙歷元年,並開始向銀河系深處拓展。

宇宙歷 799799799 年,銀河系的兩大軍事集*在巴公尺利恩星域爆發戰爭。泰山壓頂集**宇宙艦隊司令萊因哈特率領十萬餘艘戰艦出征,氣吞山河集*點名將楊威利組織麾下三萬艘戰艦迎敵。

楊威利擅長排兵布陣,巧妙運用各種戰術屢次以少勝多,難免恣生驕氣。在這次決戰中,他將巴公尺利恩星域戰場劃分成 300003000030000 列,每列依次編號為 1,2,…,300001, 2,\ldots ,300001,2,…,30000。之後,他把自己的戰艦也依次編號為 1,2,…,300001, 2, \ldots , 300001,2,…,30000,讓第 iii 號戰艦處於第 iii 列,形成「一字長蛇陣」,誘敵深入。這是初始陣形。當進犯之敵到達時,楊威利會多次發布合併指令,將大部分戰艦集中在某幾列上,實施密集攻擊。合併指令為m i j,含義為第 iii 號戰艦所在的整個戰艦佇列,作為乙個整體(頭在前尾在後)接至第 jjj 號戰艦所在的戰艦佇列的尾部。顯然戰艦佇列是由處於同一列的乙個或多個戰艦組成的。合併指令的執行結果會使佇列增大。

然而,老謀深算的萊因哈特早已在戰略上取得了主動。在交戰中,他可以通過龐大的情報網路隨時監聽楊威利的艦隊調動指令。

在楊威利發布指令調動艦隊的同時,萊因哈特為了及時了解當前楊威利的戰艦分布情況,也會發出一些詢問指令:c i j。該指令意思是,詢問電腦,楊威利的第 iii 號戰艦與第 jjj 號戰艦當前是否在同一列中,如果在同一列中,那麼它們之間布置有多少戰艦。

作為乙個資深的高階程式設計員,你被要求編寫程式分析楊威利的指令,以及回答萊因哈特的詢問。

第一行有乙個整數 ttt(1≤t≤5×1051 \le t \le 5 \times 10^51≤t≤5×105),表示總共有 ttt 條指令。

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

m i j:iii 和 jjj 是兩個整數(1≤i,j≤300001 \le i,j \le 300001≤i,j≤30000),表示指令涉及的戰艦編號。該指令是萊因哈特竊聽到的楊威利發布的艦隊調動指令,並且保證第 iii 號戰艦與第 jjj 號戰艦不在同一列。

c i j:iii 和 jjj 是兩個整數(1≤i,j≤300001 \le i,j \le 300001≤i,j≤30000),表示指令涉及的戰艦編號。該指令是萊因哈特發布的詢問指令。

依次對輸入的每一條指令進行分析和處理:

輸入 #1

4

m 2 3

c 1 2

m 2 4

c 4 2

輸出 #1

-1

1不難看出是並查集,難點在輸出兩點間數字個數,可以維護乙個front記錄乙個點前面的點的個數,

再在每個集的根維護一下集中的點的個數,合併時在上乙個節點不是根的時候即前面的數發生了改變時,

在合併中更新front,由於更新完就接入根所以不會重複。

#includeusing namespace std;

int fa[30010],front[30010]=,behind[30010]=;

int h;

int cha(int x)

else

}int bing(int r1,int r2)

int main()

if(s=='c')

}return 0;

}

NOI2002 銀河英雄傳說

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

NOI 2002 銀河英雄傳說

有 n 列戰場,每一列一開始只有乙個戰艦,編號就是對應的戰場編號。有 m 次操作 注意每一列戰場的戰艦都是排成一列的。帶偏移量的並查集。記錄 d x 表示 x 到所在列頭的一段上共有多少個戰艦。記錄 sz x 表示 x 所在的一列有多少個戰艦。為了保證複雜度,我們在做的時候還是要路徑壓縮。但是 d ...

NOI2002 銀河英雄傳說

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