玻璃球遊戲

2022-05-31 04:42:14 字數 1528 閱讀 3861

【題目描述】

小x的業餘生活中,有一項是玩滾玻璃球遊戲。

某天,小x想到了一種很無趣的玩法,當然,這種玩法就是為了玩看題的你們。

小x首先建立了乙個單向軌道,這個單向軌道可以抽象成乙個有向圖,每個頂點的出度都是1,也就是由每個點出發,只有一條邊連向其他的點。

小x的遊戲最初規則是這樣的:讓玻璃球從某乙個點出發,沿著有向邊的方向,移動到它的下乙個頂點,如果還能移動,就繼續移動,直到沒有相鄰的邊,當然會存在在乙個環裡不停運動的情況。

為了增加難度,小x決定將遊戲規則增強,他會提出一系列問題,讓你回答:

1) 格式:1 x.查詢玻璃球由編號為x的點出發,最終在哪個點停下來,如果能停下來,輸出最後的點的編號,如果停不下來,輸出」ciklus」.

2) 格式:2 x.刪除由x出發的那條有向邊。

【題解】

這題出的很有意思。

首先是逆向思維,把所有詢問存下來,然後倒著往並查集裡加邊,這樣就避免了刪邊。

然後是並查集的兩個優化:

(1)按秩合併

描述:就是在對兩個不同子集連線時,按照rank來連,也就是rank低的連在rank高的下面。rank高的做父親節點。

作用,這樣類似維護了一棵樹,樹是rank高的在上。

(2)路徑壓縮

描述:假如fa陣列已經巢狀了n層,那麼傳統的做法去找祖先要做n次,當n很大時,這種做法很沒效率。

路徑壓縮**:

int find(int x)

十分簡潔,十分好記,十分有效。

最後注意,這題來自jzyzoj1823,要想ac必須彙編開棧。

1 #include2 #include3 #include4 #include5 #include6 #include7 #include8

using

namespace

std;

9struct nodequ[300010

];10

int n,q,a[300010],f[300010],vis[300010],ans[300010

];11 inline int

read()

1215

while(isdigit(ch))

16return x*f;17}

18int find(int x)

19int

main()

2034

for(int i=1;i<=n;i++) f[i]=i;

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

36if(!vis[i]&&a[i])

3742

for(int i=q;i;i--)

4352}53

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

54if(ans[i]==-1) printf("

ciklus\n");

55else

if(ans[i]!=-2) printf("

%d\n

",ans[i]);

56return0;

57 }

轉貼 《玻璃球遊戲》的規則

是他一生中最重要的作品,這部作品對黑塞獲得諾貝爾文學獎起了很大的作用。這是一部鴻篇巨制,全書近40萬字。在介紹故事發生 告訴我們,玻璃球遊戲 有它自己高度發展的秘密語言,雖綜合了各種知識,但 是它的基礎。西方的 亨德爾 莫扎特,中國的 都囊括在玻璃球遊戲 技巧是必經之路。人物 主人公克乃希特從小聰明...

高樓扔玻璃球

大廈有100層,你手裡有兩顆玻璃球。當你拿著玻璃球在某一層往下扔的時候,一定會有兩個結果,玻璃球碎了或者沒碎。大廈有個臨界樓層。低於它的樓層,往下扔玻璃球,玻璃球不會碎,等於或高於它的樓層,扔下玻璃球,玻璃球一定會碎。玻璃球碎了就不能再扔。現在讓你設計一種方式,使得在該方式下,最壞的情況扔的次數比其...

鑽石和玻璃球遊戲 鑽石位置固定

開始,你可以隨意選擇乙個抽屜,在開啟它之前,主持人會開啟另外乙個抽屜,露出抽屜裡的玻璃球。這時,主持人會給你一次更換自己選擇的機會。請自己認真分析一下 不換選擇能有更高的機率獲得鑽石,還是換選擇能有更高的機率獲得鑽石?或機率沒有發生變化?寫出你分析的思路和結果。設法編寫python程式驗證自己的想法...