處理m個指令,都為兩種如下形式的指令之一
1.m i j 表示讓第i好戰艦所在列的全部戰艦保持原有順序,接在第j好戰艦所在列的尾部。
2.c i j,表示詢問第i號戰艦與第j號戰艦當前是否處於同一列中,如果在同一列中,它們之間間隔了多少艘戰艦。如果不在同一列中,輸出-1;
並查集第二個指令我們要知道i,j兩號戰艦差多少,維護乙個數列d即可,d[x]代表x前面的戰艦數量,要查詢的時候,我們只要知道i,j兩號前面各有多少戰艦,然後i前面的減去j前面的絕對值減一就可以了。
而第乙個指令就是簡單地處理一下size,記錄集合大小,也很簡單
#include #include using namespace std;
int f[30005];
int d[30005];
int size[30005];
int t;
int jdz(int x)
void init()
}int get(int x)
void merge(int x,int y)
int main()
{ cin>>t;
init();
for(int i=1;i<=t;i++)
{ char s[2];
int x,y;
scanf("%s",s);
cin>>x>>y;
if(s[0]=='m')
merge(x,y);
if(s[0]=='c')
{ if(get(x)==get(y))
cout《資料情況
NOI2002 銀河英雄傳說
noi2002 day1 t1 公元5801年,地球居民遷移至金牛座 第二行星,在那裡發表銀河聯邦創立宣言,同年改元為宇宙歷元年,並開始向銀河系深處拓展。宇宙歷七九九年,銀河系的兩大軍事集團在巴公尺利恩星域爆發戰爭。泰山壓頂集團派宇宙艦隊司令萊因哈特率領十萬餘艘戰艦出征,氣吞山河集團點名將楊威利組織...
NOI 2002 銀河英雄傳說
有 n 列戰場,每一列一開始只有乙個戰艦,編號就是對應的戰場編號。有 m 次操作 注意每一列戰場的戰艦都是排成一列的。帶偏移量的並查集。記錄 d x 表示 x 到所在列頭的一段上共有多少個戰艦。記錄 sz x 表示 x 所在的一列有多少個戰艦。為了保證複雜度,我們在做的時候還是要路徑壓縮。但是 d ...
NOI2002 銀河英雄傳說
公元五八 一年,地球居民遷移至金牛座 第二行星,在那裡發表銀河聯邦創立宣言,同年改元為宇宙歷元年,並開始向銀河系深處拓展。宇宙歷七九九年,銀河系的兩大軍事集 在巴公尺利恩星域爆發戰爭。泰山壓頂集 宇宙艦隊司令萊因哈特率領十萬餘艘戰艦出征,氣吞山河集 點名將楊威利組織麾下三萬艘戰艦迎敵。楊威利擅長排兵...