銀河英雄傳說(並查集操作)

2021-08-15 21:15:34 字數 1447 閱讀 6843

p1196 [noi2002]銀河英雄傳說

鏈結戳這裡☞

銀河英雄傳說

先不說什麼,直接上**吧!

#include

#include

#include

#include

using

namespace

std;

struct sdnode[300003];

int njc(int n)

int father(int v)

return node[v].x;

}void modify(int a,int b)

void query(int a,int b)

}int main()

int a,b;

char c[2];//☣

for(int i=1;i<=n;++i)

if(c[0]=='c')

}return

0; }

看完了吧!

我覺得大佬可以跳過這一段了。

下面讓我們來講一講本題的重點:

這個father和以前使用的while版不一樣

while版father函式部分:

int father(int v)

return v;

}

遞迴版father函式部分:
int father(int v)

return node[v].x;

}

特別注意!!!!

**在下面這段話中「前面」指:靠近兒子的資訊

「後面」指靠近father的資訊**

這裡主要區別就是,遞迴版的father不需要在寫乙個while來進行路徑壓縮,他直接遞迴到最後一次,然後所有兒子的father就變成了根節點,然後只需要維護一下位置資訊就可以了,並且因為他有乙個回溯的過程,所以說不會存在while的空中樓閣問題(指用後面的資訊維護了前面的點,但是因為while是順著迴圈的,他沒有遞迴的回溯過程,所以有可能會出現前面的被後面的資訊維護後,後面的資訊又被更改了!)(這段話寫的我好難受!!!)

維護語句:

node[v].loc+=node[i].loc-1;

自己原來的位置+自己father的位置=自己現在的位置。

p.s:

1、有人可能會問我,維護語句感覺好像沒有什麼用啊?其實他是為了和modify一起配合使用,當乙個艦隊接入另乙個艦隊的時候,在modify中我們會更改要接入的頭的爸爸,而這時,進行father的時候就可以把跟著第二支艦隊旗艦的後面的戰艦的位置用維護語句更新他們的位置。

2、定義的字串(輸c,m命令的那個)一定要開成全域性變數,否則wa的你飛起!(玄學)

3、最好改變一下寫father的習慣,以後都用遞迴寫!

鏈結一下另一篇題解銀河英雄傳說

並查集 銀河英雄傳說

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

並查集 銀河英雄傳說

2002年noi全國競賽 時間限制 1 s 空間限制 256000 kb 題目等級 大師 master 公元五八 一年,地球居民遷移至金牛座 第二行星,在那裡發表銀河聯邦創立宣言,同年改元為宇宙歷元年,並開始向銀河系深處拓展。宇宙歷七九九年,銀河系的兩大軍事集 在巴公尺利恩星域爆發戰爭。泰山壓頂集 ...

方塊遊戲 (銀河英雄傳說)(並查集)

方塊遊戲 cubes.pas c cpp 題目描述 小a和小b在玩乙個方塊遊戲。編號為1到n 1 n 30000 的n個方塊正放在地上。每個構成乙個立方柱。遊戲開始後,小a會給小b發出p 1 p 100000 個指令。1 移動 m 將包含x的立方柱移動到包含y的立方柱上。2 統計 c 統計含x的立方...