CodeForces - 820D Mister B and PR Shifts(思维+模拟)
生活随笔
收集整理的這篇文章主要介紹了
CodeForces - 820D Mister B and PR Shifts(思维+模拟)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目鏈接:點擊查看
題目大意:給出一個長度為 n 的排列 p,可以執行數次循環右移的操作,問的最小值是多少
題目分析:暴力的話用 n * n 很容易實現 ,但數據是 1e6 的,顯然又不能用暴力去寫,所以考慮優化
首先去掉絕對值后將 n 個數分成兩類:
假設第一類有 upper 個,第二類有 lower 個,那么循環右移一次,不難看出其變化的貢獻是 delta = upper - lower,由此我們可以實時維護 upper 和 lower 的個數,就可以快速更新每次循環右移后的答案了
更具體的來說,我們第 i 次循環右移,實質上是將第 n - i + 1 個數字放到了第一個位置,因為這個位置比較特殊,所以每次需要單獨計算貢獻,而不能利用 upper 和 lower 進行計算
需要觀察到,隨著循環右移次數的增加,第二類數也會變成第一類數,而第一類數當且僅當從最后一個位置放到第一個位置時才會變換
考慮第二類數何時會變成第一類數,因為每次循環右移一次,假設 p[ i ] 不變,但其相對下標會加一,所以在 p[ i ] - i 次循環右移后,p[ i ] 會回到下標為 p[ i ] 的位置,此時 lower--,upper++
所以模擬就好了,記得數組開大點
代碼:
?
?
總結
以上是生活随笔為你收集整理的CodeForces - 820D Mister B and PR Shifts(思维+模拟)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CodeForces - 1455E F
- 下一篇: CodeForces - 336D Va