【題目描述】
小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 #include8using
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程式驗證自己的想法...