題解 小p的新牧場 詳解斜率優化

2022-07-12 05:42:08 字數 1869 閱讀 5829

小 p 是個特麼喜歡玩 mc 的孩紙。。。

小 p 在 mc 裡有 n 個牧場,自西向東呈一字形排列(自西向東用 1…n 編號),於是 他就煩惱了:為了控制這 n 個牧場,他需要在某些牧場上面建立控制站,每個牧場 上只 能建立乙個控制站,每個控制站控制的牧場是它所在的牧場一直到它西邊第乙個控 制站 的所有牧場(它西邊第乙個控制站所在的牧場不被控制)(如果它西邊不存在控制站, 那麼它控制西邊所有的牧場),每個牧場被控制都需要一定的花費(畢竟在控制站到 牧 場間修建道路是需要資源的嘛~),而且該花費等於它到控制它的控制站之間的牧場 數目 (不包括自身,但包括控制站所在牧場)乘上該牧場的放養量,在第 i 個牧場建立 控制 站的花費是 ai,每個牧場 i 的放養量是 bi,理所當然,小 p 需要總花費最小,但 是小 p 的智商有點不夠用了,所以這個最小總花費就由你來算出啦。

第一行乙個整數 n 表示牧場數目 第二行包括 n 個整數,第 i 個整數表示 ai 第三行包括 n 個整數,第 i 個整數表示 bi 輸出格式 只有一行,包括乙個整數,表示最小花費

2 4 2 4

3 1 4 2

選取牧場 1,3,4 建立控制站,最小費用為 2+( 2 + 1 * 1 ) + 4 = 9。

對於 10%的資料,1 <= n <= 10 對於 30%的資料,1 <= n <= 1000 對於 100%的資料,1 <= n <= 1000000 , 0 < ai,bi <= 10000

顯而易見 設 dp[ i ] 表示到 i 為止的最小費用 轉移時只需列舉上乙個控制站 j 即可

方程化簡原方程發現:

設su[ i ]為b[ i ]的字首和 ts[ i ]為b[ i ] * i 的字首和

則方程可表示為

dp[ i ] = min( dp[ j ] + i *(su[ i - 1 ] - su[ j ])- ( ts[ i - 1 ] - ts[ j ] ) + a[ i ] )

因i在列舉j時相當於定值 進一步有

dp[ i ] = min( dp[ j ] - i * su[ j ] + ts[ j ] ) + i * su[ i - 1 ] - ts[ i - 1 ] + a[ i ] 

列舉j即可

將min函式忽略 j的相關項移至等號左邊  i與j的乘積項仍保留在右邊

ts[ j ] + dp[ j ] = i * su[ j ]- i * su[ i - 1 ] + ts[ i - 1 ] - a[ i ] + dp[ i ]

可以發現 這是乙個以i為斜率的一次函式 左邊視為縱座標 su[ j ]為橫座標 i即為斜率  - i * su[ i - 1 ] + ts[ i - 1 ] - a[ i ] + dp[ i ]則為截距

使dp[i]最小 即使截距最小

我們要做的 就是找到哪個j使得截距最小

因為縱座標單調上公升 橫座標也單調上公升 斜率為定值

顯而易見 用單調佇列維護乙個關於橫座標與縱座標的下凸包 

並使下凸包兩點間的斜率大於i 最左邊的點即為所要找的j

再將i插入單調佇列 將隊尾與i不符合下凸包性質的點彈出使i插入後佇列仍滿足下凸包性質即可 

#include#include

#include

#include

using

namespace

std;

long

long a[1000001],t[1000001],n,dp[1000001],su[1000001],ts[1000001

];long

long dl[1000001

];double count(long

long a,long

long

b)int

main()

cout

<

return0;

}

bzoj 3437 小P的牧場 斜率優化

time limit 10 sec memory limit 128 mb 小p在mc裡有n個牧場,自西向東呈一字形排列 自西向東用1 n編號 於是他就煩惱了 為了控制這n個牧場,他需要在某些牧場上面建立控制站,每個牧場上只能建立乙個控制站,每個控制站控制的牧場是它所在的牧場一直到它西邊第乙個控制站...

小 P 的牧場 題解

小 p 在 mc 裡有 n 個牧場,自西向東呈一字形排列 自西向東用 1 n 編號 於是他就煩惱了 為了控制這 n 個牧場,他需要在某些牧場上面建立控制站,每個牧場上只能建立乙個控制站,每個控制站控制的牧場是它所在的牧場一直到它西邊第乙個控制站的所有牧場 它西邊第乙個控制站所在的牧場不被控制 如果它...

bzoj3437 小p的牧場 斜率優化dp

背景 小p是個特麼喜歡玩mc的孩紙。描述小p在mc裡有n個牧場,自西向東呈一字形排列 自西向東用1 n編號 於是他就煩惱了 為了控制這n個牧場,他需要在某些牧場上面建立控制站,每個牧場上只能建立乙個控制站,每個控制站控制的牧場是它所在的牧場一直到它西邊第乙個控制站的所有牧場 它西邊第乙個控制站所在的...