BZOJ3156 防禦準備 斜率優化DP

2022-05-16 03:04:13 字數 923 閱讀 1042

裸的斜率優化,記一下以後複習用吧。

要直接dp很明顯應該要倒著dp,很不爽,先把它倒過來。

令$sum[j]=\sum_^ji$,

於是我們首先推出這樣乙個方程$$f[i]=min\$$

這樣dp複雜度是$o(n^)$的,考慮斜率優化。

設$k>j$,且$k$優於$j$,則有$$f[k]+sum[i-1]-sum[k]-(i-k-1)*k+a[i]

整理得$$f[k]-f[j]-(sum[k]-sum[j])+k^-j^+k-j

把$k-j$直接除過去,得$slope(k,j)

這樣就可以用單調佇列來維護。

1 #include2 #include3 #include4

using

namespace

std;

5 typedef long

long

ll;6

const ll inf=1ll<<62;7

intinline readint()

13int n,data[1000010],a[1000010

];14 ll f[1000010],sum[1000010

];15

int q[1000010

],h,t;

16double slope(int k,int

j)19

intmain()

26 h=t=1

;27 f[1]=a[1

];28 q[1]=1

;29 ll ans=f[1]+sum[n]-sum[1]-n+1;30

for(int i=2;i<=n;i++)

37 printf("

%lld

",ans);

38return0;

39 }

BZOJ3156 防禦準備 斜率優化

第一行為乙個整數n表示戰線的總長度。第二行n個整數,第i個整數表示在位置i放置守衛塔的花費ai。共乙個整數,表示最小的戰線花費值。102 3 1 5 4 5 6 3 1 2 181 n 10 6,1 ai 10 9 題解 一眼看出斜率優化dp,先列出方程再說 令f i 表示在i處放置守衛塔,且i左面...

bzoj 3156 防禦準備 斜率優化 DP

傳送門 第一行為乙個整數n表示戰線的總長度。第二行n個整數,第i個整數表示在位置i放置守衛塔的花費ai。共乙個整數,表示最小的戰線花費值。10 2 3 1 5 4 5 6 3 1 2 181 n 10 6,1 ai 10 9 斜率優化 dp 因為最後乙個一定為守衛塔,所以輸入時預處理到過來,接下來說...

BZOJ3156 防禦準備(斜率優化dp)

題目 我是超連結 題解 woc!調了一大節課,還對拍樣程 完全沒有問題啊,拍了一晚上都不帶錯的 結果看好數量級之後強轉longlong才a了 第一種解法 兩個點之間的距離是 i j i j 1 2 方程 f i min f j i j i j 1 2 a i include include defi...