「雜題亂刷2」CF2040D

wangmarui發表於2024-12-10

題目連結

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。