題意
給定一個大小爲 的樹,它共有 個結點與 條邊,結點從 編號。初始時每個結點上都有一個 的數字,且每個 的數字都只在恰好一個結點上出現。
接下來你需要進行恰好 次刪邊操作,每次操作你需要選一條未被刪去的邊,此時這條邊所連接的兩個結點上的數字將會交換,然後這條邊將被刪去。
次操作過後,所有的邊都將被刪去。此時,按數字從小到大的順序,將數字 所在的結點編號依次排列,就得到一個結點編號的排列 。現在請你求出,在最優操作方案下能得到的字典序最小的 。
如上圖,藍圈中的數字 一開始分別在結點 ②、①、③、⑤、④。按照 (1)(4)(3)(2) 的順序刪去所有邊,樹變爲下圖。按數字順序得到的結點編號排列爲 ①③④②⑤,該排列是所有可能的結果中字典序最小的。
數據範圍:
測試點編號 | $n\le $ | 特殊性質 |
---|---|---|
無 | ||
樹的形態是一條鏈 | ||
樹的形態是一條鏈 | ||
存在度數爲 的結點 | ||
存在度數爲 的結點 | ||
無 | ||
無 |
對於所有測試點:,保證給出的是一個樹。
題解
吐槽:
幾個月後再回過頭來看這道考場上完全自閉的題,沒看題解按自己新的想法寫了半天過了。其實思路非常自然,完全沒有之前想象的神仙。雖然確實有一定細節需要耗費較多時間(指以我的垃圾思考力),但至少鏈和菊花圖的分都比較好拿,也不知道當時在幹什麼。
可能還是臨場心態的問題吧,當時想着18年人均AK的D1,然後一開始沒什麼想法就真的很絕望,於是在自閉中結束了考試。現在想來還是好可惜啊,按照這個思路在考試還剩2.5h的情況下至少能多拿鏈+菊花圖的50pts吧(一開始試驗了鏈的代碼只有1.5k,菊花圖應該更好寫)。之前考場的心態一直不太對,總想着能拿多少分,會不會被別人區分掉。其實真正的目標應該考出自己應有的實力,不要留下遺憾吧。這樣就算沒考好,也能夠問心無愧地說一句技不如人,而不是重新審視這場考試再來後悔莫及。
希望省選,不要帶着遺憾退役,畢竟OI生涯至今並沒有任何一場自己滿意的考試(也沒考過幾次就是了)。
正話:
顯然按位考慮每個數,儘量使它放到編號最小的點上。問題在於如何判斷一個數是否可以從號點出發恰好走到號點:將這個轉化到邊的排列順序的限制上(因爲限制就在於每條邊恰好用一次),畫圖可知等價於對於經過的一系列邊,每相鄰兩條在相交的點的所有邊中的順序是相鄰的,且在上的邊一定是u的邊中最先取的,同理在v的是最後,容易感性認知 證明其充分必要性。
於是用標記數組存每條邊在兩個端點上是否有相鄰的限制。同時,在一個點的連邊中的相鄰限制關係還不能構成環,用並查集維護一下即可。特殊地,還要考慮一個點的一條邊是最先/最後取的情況,如果最先和最後取的邊在同一並查集上,那麼這個並查集必須包含這個點的所有邊。直接做是的,預處理當前的點能到達哪些節點,即可做到。
(我是真的弱智吧,考場上怎麼能沒有想法啊???)