Arithmetic Sequence 三分,货仓选址,nth_element,__int128(济南)
生活随笔
收集整理的這篇文章主要介紹了
Arithmetic Sequence 三分,货仓选址,nth_element,__int128(济南)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題意 :
- 給一序列,每次操作選擇一個數加一或者減一,需要將這個序列變成等差數列,問最小操作數
思路 :
- 數據范圍很大又沒有頭緒,想到二分或者三分。對于不同的公差d,肯定是只有一個最優,兩邊的都比這個公差大,這就是個單谷函數(代價隨公差的變化是一個單谷函數),我們可以用三分來求這個公差。
- 但有了公差還無法確定首項,再套一個三分會TLE
- 設首項為x,公差為d,那么變化第一項的次數為∣x?a[1]∣|x-a[1]|∣x?a[1]∣,第二項為∣x+d?a[2]∣|x+d-a[2]|∣x+d?a[2]∣,|x+d*2-a[3]|,…,設t[i]=a[i]?d?(i?1)t[i]=a[i] - d*(i-1)t[i]=a[i]?d?(i?1),每一項的變化就會轉化為∣x?t[i]∣|x-t[i]|∣x?t[i]∣(每一項的這個距離都共享同一個端點x,注意為什么是把它轉換成了絕對值里面的減法而不是轉換成絕對值里的加法,畢竟距離肯定有更好的性質),就轉化成了貨倉選址問題,因此,找到中位點即可
- 需要用nth_element找中位點,sort復雜度會超(由于三分的時間復雜度要高于二分,因此求中位數禁止使用sort,請使用快速選擇算法或者部分快速排序,下面的代碼使用了北京大學提供的題解上使用的nth_element函數求解)
- 可能會超long long,需要開128(由于數據范圍過大(1e13*2e5),在運算過程中可能會爆long long,請使用128位整數__int128)
總結
以上是生活随笔為你收集整理的Arithmetic Sequence 三分,货仓选址,nth_element,__int128(济南)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Optimal Strategy 组合数
- 下一篇: Consecutive Sum Ridd