題意:共有30000個人,編號為1-30000,開始時每個人一列。然後進行兩種操作:m i j表示把第i個人所在的列的隊首加到第j個人所在的列的隊尾。c i j查詢第i個人和第j個人是否在一列,假如在一列詢問i和j間隔著幾個人。
題解:
1.不同於以前的帶權並查集,這個除了fa陣列和d陣列外,加了乙個num陣列,num[i]表示第i列為隊首的佇列有幾個人。d[i]表示i到隊首有幾個人。
#includeusing namespace std ;
#define n 30005
typedef long long ll ;
int t ;
int fa[n] ;
int d[n] ;//d[i]表示第i個人到隊首有幾個人。
int num[n] ;//num[i]表示以第i個人為隊首有幾個人。
void init()
}int get(int x)
void merge(int x , int y)
void query(int x , int y)
printf("%d\n" , abs(d[x] - d[y]) - 1) ;
}int main()
}
NOI 2002 銀河英雄傳說(帶權並查集)
小聲bb 我覺得帶權並查集比較玄妙 傳送門qaq 很容易想到用並查集來維護 設size表示當前佇列的數量 以i為隊頭的數量 to root表示當前節點到祖宗的距離 則對於每乙個飛船,它到隊頭的距離,就等於它到它祖先的距離加上它祖先到隊頭的距離,而它的祖先到隊頭的距離,也可以變成類似的。可以在getf...
NOI 2002 銀河英雄傳說(帶權並查集)
小聲bb 我覺得帶權並查集比較玄妙 傳送門qaq 很容易想到用並查集來維護 設size表示當前佇列的數量 以i為隊頭的數量 to root表示當前節點到祖宗的距離 則對於每乙個飛船,它到隊頭的距離,就等於它到它祖先的距離加上它祖先到隊頭的距離,而它的祖先到隊頭的距離,也可以變成類似的。可以在getf...
NOI2002銀河英雄傳說 帶權並查集
公元五八 一年,地球居民遷至金牛座 第二行星,在那裡發表銀河聯邦創立宣言,同年改元為宇宙歷元年,並開始向銀河系深處拓展。宇宙歷七九九年,銀河系的兩大軍事集 在巴公尺利恩星域爆發戰爭。泰山壓頂集 宇宙艦隊司令萊因哈特率領十萬餘艘戰艦出征,氣吞山河集 點名將楊威利組織麾下三萬艘戰艦迎敵。楊威利擅長排兵布...