NOIP 加塞 5

Aqr_Rn發表於2024-11-15

打成 史 了,\(0+20+0+45\),還有半個月 NOIP 了,怎麼還是打這點分呢 ??

CTH 要看,所以先發了

比賽連結

A. 暴力操作

二分答案

對於一個數 \(a_i\) 它變成 \(\lfloor \frac{a_i}{x} \rfloor\) 的代價是 \(c_x = \forall y\mid x, min( c_y+c_{\frac {x}{y}} )\)

調和級數複雜度處理出來每個 \(c_i\),再對 \(c\) 陣列取字尾最小值二分答案即可

B. 異或連通

賽時沒多想這道題(也想不出來,畢竟不會線段樹分治),打了 0/1 的部分分和暴力,結果 0/1 的還掛了

【 線段樹分治 + 0/1 trie 】 / 【 trie 樹分治 】

對於每次詢問離線下來按詢問的 \(x\) 大小排序插進 0/1 trie 裡,較容易發現都經過 trie 樹上同一個點的一定是一段連續的區間,所以按排序後的詢問編號為線段樹下標,建好 0/1 trie 後查詢每一個邊權 \(c_i\) 時把這條邊插進經過的點所代表的區間的線段樹裡。

C. 詭異鍵盤

D. 民主選舉

二分類答案

對於一個節點 \(x\)\(size_x\) 表示以 \(x\) 這個節點為根的子樹大小,\(son_x\) 表示和 \(x\) 直接相連的子節點個數

考慮找到一個最小的值 \(res\) 滿足所有點得到的票數 \(<res\),多餘的票數上傳給父親,能分完所有的票沒有冗餘

發現 \(res\) 具有單調性,直接二分做,時間複雜度 \(O(n\log )\) ,每次 check 需要跑一遍 dfs,具體實現自己想想,和暴力相同。

這個時候如果直接特判 \(size_i - 1 \ge res\) 就合法,否則不合法,其實少考慮了一種合法的情況:

當我們判斷 \(i\) 點是否合法的時候,發現其實除了 \(i\) 以外的點才需要滿足最多有 \(res-1\) 張票,而 \(i\) 點可以有 \(res\) 張票。

那麼也就是說若 \(size_i=res\) 也有可能是合法的,此時有可能是雖然沒辦法讓所有點得到的票數都小於 \(res-1\),但有可能除了 \(i\) 以外的其他點得到了 \(res-1\) 張票,而 \(i\) 自己得到了 \(res\) 張票是可以做到的。

所以有對於所有 \(size_x=res\) 的點特判:

做一遍二分時的 \(check(res-1)\) ,dfs 的過程中記錄到每個點 \(i\) 目前冗餘的票數(直接拿子節點傳上來的票數加上 \((son_i-(res-1))\),和 0 取 max)

  • 最後根節點的冗餘票數若為 0,則 \(x\) 點一定合法;

  • 若根節點的冗餘票數 \(>1\),則一定合法:因為這種情況下即使 \(x\) 比別的點多選一張票,也就是少向上傳一張票,也做不到讓根節點的冗餘票數為 0;

  • 而根節點的冗餘票數恰好為 1 的時候有可能合法:此時即為 \(x\) 點少向上傳一張票從而使得根節點的冗餘票數為 0。

    • 這個時候再特判一下從根節點到 \(x\) 的路徑上是否存在冗餘票數為 0 的情況,若有則還是不合法的:因為若存在冗餘票數為 0,再減去 \(x\) 少上傳上去的這一張票就成負的了,意味著到這個點便不會再向上繼續減去那一張票了。