DTOJ 4653. 「CSP-S 2019」樹上的數

題意

給定一個大小爲 nn 的樹,它共有 nn 個結點與 n1n − 1 條邊,結點從 1n1 \sim n 編號。初始時每個結點上都有一個 1n1 \sim n 的數字,且每個 1n1 \sim n 的數字都只在恰好一個結點上出現。

接下來你需要進行恰好 n1n − 1 次刪邊操作,每次操作你需要選一條未被刪去的邊,此時這條邊所連接的兩個結點上的數字將會交換,然後這條邊將被刪去。

n1n − 1 次操作過後,所有的邊都將被刪去。此時,按數字從小到大的順序,將數字 1n1 \sim n 所在的結點編號依次排列,就得到一個結點編號的排列 PiP_i。現在請你求出,在最優操作方案下能得到的字典序最小PiP_i

QSE3qS.png

如上圖,藍圈中的數字 151 \sim 5 一開始分別在結點 ②、①、③、⑤、④。按照 (1)(4)(3)(2) 的順序刪去所有邊,樹變爲下圖。按數字順序得到的結點編號排列爲 ①③④②⑤,該排列是所有可能的結果中字典序最小的。

QSENPs.png

數據範圍:

測試點編號 $n\le $ 特殊性質
121\sim 2 1010
343\sim 4 160160 樹的形態是一條鏈
575\sim 7 2×1032\times 10^3 樹的形態是一條鏈
898\sim 9 160160 存在度數爲 n1n − 1 的結點
101210\sim 12 2×1032\times 10^3 存在度數爲 n1n − 1 的結點
131613\sim 16 160160
172017\sim 20 2×1032\times 10^3

對於所有測試點:1T101 \le T \le 10,保證給出的是一個樹。

題解

吐槽:

幾個月後再回過頭來看這道考場上完全自閉的題,沒看題解按自己新的想法寫了半天過了。其實思路非常自然,完全沒有之前想象的神仙。雖然確實有一定細節需要耗費較多時間(指以我的垃圾思考力),但至少鏈和菊花圖的分都比較好拿,也不知道當時在幹什麼。

可能還是臨場心態的問題吧,當時想着18年人均AK的D1,然後一開始沒什麼想法就真的很絕望,於是在自閉中結束了考試。現在想來還是好可惜啊,按照這個思路在考試還剩2.5h的情況下至少能多拿鏈+菊花圖的50pts吧(一開始試驗了鏈的代碼只有1.5k,菊花圖應該更好寫)。之前考場的心態一直不太對,總想着能拿多少分,會不會被別人區分掉。其實真正的目標應該考出自己應有的實力,不要留下遺憾吧。這樣就算沒考好,也能夠問心無愧地說一句技不如人,而不是重新審視這場考試再來後悔莫及。

希望省選,不要帶着遺憾退役,畢竟OI生涯至今並沒有任何一場自己滿意的考試(也沒考過幾次就是了)。

正話:
顯然按位考慮每個數,儘量使它放到編號最小的點上。問題在於如何判斷一個數是否可以從uu號點出發恰好走到vv號點:將這個轉化到邊的排列順序的限制上(因爲限制就在於每條邊恰好用一次),畫圖可知等價於對於經過的一系列邊,每相鄰兩條在相交的點的所有邊中的順序是相鄰的,且在uu上的邊一定是u的邊中最先取的,同理在v的是最後,容易感性認知 證明其充分必要性。
於是用標記數組存每條邊在兩個端點上是否有相鄰的限制。同時,在一個點的連邊中的相鄰限制關係還不能構成環,用並查集維護一下即可。特殊地,還要考慮一個點的一條邊是最先/最後取的情況,如果最先和最後取的邊在同一並查集上,那麼這個並查集必須包含這個點的所有邊。直接做是O(n3)O(n^{3})的,預處理當前的點能到達哪些節點,即可做到O(n2)O(n^{2})
(我是真的弱智吧,考場上怎麼能沒有想法啊???)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章