BZOJ3156 防禦準備 斜率優化dp

2021-08-11 10:22:31 字數 1206 閱讀 6954

time limit: 10 sec  memory limit: 512 mb

submit: 2207  solved: 933

[submit][status][discuss]

第一行為乙個整數n表示戰線的總長度。

第二行n個整數,第i個整數表示在位置i放置守衛塔的花費ai。

共乙個整數,表示最小的戰線花費值。

102 3 1 5 4 5 6 3 1 2

181<=n<=10^6,1<=ai<=10^9

練了幾題,這類題目的模式還是很固定好寫的

就不推了

設f[i]表示i位置放防禦塔的最小代價

顯然有f[i] = min + a[i]    【中間那一段就是中間木偶的代價】

去掉常數化簡有2 * i * j + 2 * f[i] = (2 * f[j] + j^2 + j)

令y = 2 * f[j] + j^2 + j,x = j

就是y = 2i * x + 2 * f[i]

化為求截距最小,由於所有值都是單調遞增,維護下凸包

#include#include#include#include#define eps 1e-9

#define ll long long int

#define rep(i,n) for (int i = 1; i <= (n); i++)

#define fo(i,x,y) for (int i = (x); i <= (y); i++)

#define redge(u) for (int k = head[u]; k != -1; k = edge[k].next)

using namespace std;

const int maxn = 1000005,maxm = 100005,inf = 1000000000;

inline ll read()

while (c >= 48 && c <= 57)

return out * flag;

}ll n,q[maxn],head,tail;

ll a[maxn],f[maxn];

inline double slope(ll u,ll v)

inline ll getf(ll i,ll j)

int main()

cout<

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...