題目連結
CF2040D Non Prime Tree
解題思路
挺好的題啊,賽時 10min 胡了個正解,但是 \(ans\) 陣列打成 \(a\) 虛空除錯 15min,怎麼回事呢。
解法一
賽時做法。
可以看出當前無論怎麼填,只要狀態合法,那麼一定有至少一種方案可以將整棵樹都被填滿,但是我不會證明啊。
於是我們就有一個暴力做法,那就是直接欽定根節點的值為 \(1\),然後直接暴力列舉最早的子節點的值使其合法,就行了。
感覺時間複雜度是 \(O(n^2)\)?我不會證啊。
發現上述演算法的瓶頸只在於暴力列舉,我們又注意到 \(1 \sim n\) 的合數密度是很大的,因此直接從根到葉子結點依次隨機出可行的權值就行了。
時間複雜度近似 \(O(n)\) 吧,我不會證啊。
解法二
應該是正經做法吧。
發現相鄰節點結點填差為 \(1\) 時總是最優的。
儘量多構造這種東西,然後就下來形如構造 \(4,6,8 \dots\) 的差的形式即可。
容易證明上述構造的權值可以 \(\le 2n\)。
其他題解應該講的挺清晰了吧,在此不再敘述程式碼細節。
時間複雜度 \(O(n)\)。
參考程式碼
解法一的程式碼,覺得有問題的可以來 hack。