NOI2002 銀河英雄傳說

2022-05-05 18:39:08 字數 1039 閱讀 6974

傳送門

這道題很明顯是一道並查集 + 維護並查集中元素到根結點之間距離的題。

具體的維護方法也很簡單。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 銀河英雄傳說

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