傳送門
這道題很明顯是一道並查集 + 維護並查集中元素到根結點之間距離的題。
具體的維護方法也很簡單。fa陣列表示每個點的父親,dis陣列表示當前節點到父親的距離,sum陣列表示當前節點所在集合中元素個數。預處理的時候把每個點的dis設為0,sum設為1.
之後對於每次戰艦合併操作,將其中乙個戰艦所在集合合併至另乙個戰艦所在集合,被合併的集合的dis要加上另乙個的sum,另乙個集合的sum加上被合併集合的sum,並把被合併的集合的sum清零。詢問操作就是先求出兩艘戰艦之間dis之差的絕對值,之後再-1.
然後對於找父親的操作,我們比普通的並查集多了乙個維護距離,只要先更新自己的父親的dis,之後對於自己,則有dis[x] += dis[fa[x]]即可。
這個還是很好理解的……上**。(好像這題用我的快讀有bug……?沒辦法用了cin)
#include#include#include
#include
#include
#define rep(i,a,n) for(int i = a;i <= n;i++)
#define per(i,n,a) for(int i = n;i >= a;i--)
#define enter putchar('\n')
using
namespace
std;
const
int m = 30005
;typedef
long
long
ll;int
read()
while(ch >= '
0' && ch <= '9'
)
return ans *op;
}char
c;int t,fa[m+5],dis[m+5],num[m+5
],a,b;
int getfa(int
x)int
main()
if(c == 'c'
)
}return0;
}
NOI2002 銀河英雄傳說
noi2002 day1 t1 公元5801年,地球居民遷移至金牛座 第二行星,在那裡發表銀河聯邦創立宣言,同年改元為宇宙歷元年,並開始向銀河系深處拓展。宇宙歷七九九年,銀河系的兩大軍事集團在巴公尺利恩星域爆發戰爭。泰山壓頂集團派宇宙艦隊司令萊因哈特率領十萬餘艘戰艦出征,氣吞山河集團點名將楊威利組織...
NOI 2002 銀河英雄傳說
有 n 列戰場,每一列一開始只有乙個戰艦,編號就是對應的戰場編號。有 m 次操作 注意每一列戰場的戰艦都是排成一列的。帶偏移量的並查集。記錄 d x 表示 x 到所在列頭的一段上共有多少個戰艦。記錄 sz x 表示 x 所在的一列有多少個戰艦。為了保證複雜度,我們在做的時候還是要路徑壓縮。但是 d ...
NOI2002 銀河英雄傳說
公元五八 一年,地球居民遷移至金牛座 第二行星,在那裡發表銀河聯邦創立宣言,同年改元為宇宙歷元年,並開始向銀河系深處拓展。宇宙歷七九九年,銀河系的兩大軍事集 在巴公尺利恩星域爆發戰爭。泰山壓頂集 宇宙艦隊司令萊因哈特率領十萬餘艘戰艦出征,氣吞山河集 點名將楊威利組織麾下三萬艘戰艦迎敵。楊威利擅長排兵...