NOI2014題解


起床困難綜合症(BZOJ 3668)

送分題,直接從高位向低位貪心。

魔法森林(BZOJ 3669)

一個容易想到的辦法就是枚舉A的最大值,以B作為權值求最小生成樹。暴力的話要T的。如果從小到大枚舉A的最大值,每次僅會添加一些新的邊,所以自然想到用LCT維護。本來還可以考一下LCT的,結果考場上A此題的人多半都寫的各式各樣的黑暗算法。真不知道出題人是怎么出的數據。

動物園(BZOJ 3670)

題目里面就把題解都說明白了,要用KMP。求了next數組后,以next為邊建成一棵樹,然后就很好做了,只需要知道到根的鏈上有多少標號不超過當前點標號一半的點。由於是單調的,直接二分就好了。注意不能暴力移動父節點一半的位置來得到新的位置,這樣最壞不是O(n)的,雖然隨機數據跑得飛快(隨機數據隨便怎么暴力都跑得飛快)。很容易構造數據卡成O(n^2),像這樣就行了:前面一串a,中間一串b,末尾又一串a。不過官方數據似乎過弱,有人這么寫當場就A了。

隨機數生成器(BZOJ 3671)

很逗的題。只要不被隨機忽悠,這題就成了大水題。貪心從小到大填,能填就填。每一行可填的位置一定時刻有個上下界,開兩個數組暴力維護就行了。判斷能否填是O(1)的,填入是O(n)的,而填入的次數是O(n)的,所以總復雜度是O(n^2)了。整個考的就是數組和for循環,5分鍾之內就能寫出來。卡內存?能用short的用short就行了。不過考場上的我更逗,寫了個線段樹維護上下界,判斷和填入都是O(lgn)的,而且當時居然還開了n^2級別的線段樹節點,我都不知道自己當時怎么想的!

購票(BZOJ 3672)

這題應當是本次NOI中最有價值的一道題了。考場上只搞出了t=0或1的數據,拿了70分。當時想的是用可持久化Treap維護每個節點到根節點的下凸殼,但是只要有距離限制就直接跪了,沒法將凸殼拆一段下來。后來研究了半天,才發現分治大法好。

考慮鏈上帶距離限制該怎么做(t=2)。cdq分治就行了。下面想怎么轉換到樹上。

點分治的時候,我們抓個重心出來,將重心去掉后樹就變成了幾棵樹。其中有包含重心父節點的那棵。這棵樹中的節點顯然不會從其他樹中的節點轉移過來,所以可以先處理這棵樹。然后我們處理這棵樹對另外的樹的貢獻,這和cdq分治就很像了。類似地做就是了。需要注意的是樹中所有以重心為“端點”的轉移都應該被處理,被打上標記后重心就不會被考慮了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM