BZOJ1096 倉庫建設

2022-03-31 14:18:23 字數 1337 閱讀 3826

目錄題目傳送門

也是一道比較經典的斜率優化\(dp\),很容易推出dp轉移方程:

\(dp[i]=min(dp[j]+cost(i,j))+c[i]\)

重點就是怎麼快速的算出cost(i,j)。我們把cost的計算公式寫出來:

\(cost(i,j)=\sum_^ip[k]*(x[i]−x[k])=x[i]*\sum_^ip[k]-\sum_^ip[k]*x[k]\)

我們記sum[i]為p[i]的字首和,b[i]為p[i]∗x[i]的字首和,那麼dp轉移就是:

\(dp[i]=min(dp[j]+x[i]*(sum[i)−sum[j])−(b[i])−b[j])+c[i]\)

於是我們就可以愉悅的用斜率優化來做這道題了,如果k>j並且k比j更優,那麼:

\(dp[j]+x[i]*(sum[i]sum[j])−(b[i])−b[j]≥dp[k]+x[i]*(sum[i)−sum[k])−(b[i])−b[k]\)

最後就是套用斜率優化的步驟了。

#include using namespace std;

typedef long long ll;

bool finish_read;

templateinline void read(t &x)while(isdigit(ch))x=x*10+ch-'0',ch=getchar();x*=f;finish_read=1;}

templateinline void print(t x)

templateinline void writeln(t x)

templateinline void write(t x)

/****************=header template**********====*/

#define pause printf("press enter key to continue..."); fgetc(stdin);

const int maxn=1e6+500;

int n;

ll dis[maxn],c[maxn],p[maxn],f[maxn],sum[maxn],b[maxn];

int l,r;

int que[maxn];

/****************===define area***************=*/

double cal(int x,int y)

int main()

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

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

printf("%lld\n",f[n]);

return 0;

}

bzoj1096 倉庫建設

l公司有n個工廠,由高到底分布在一座山上。如圖所示,工廠1在山頂,工廠n在山腳。由於這座山處於高原內陸地區 乾燥少雨 l公司一般把產品直接堆放在露天,以節省費用。突然有一天,l公司的總裁l先生接到氣象部門的 被告知三天之後將有一場暴雨,於是l先生決定緊急在某些工廠建立一些倉庫以免產品被淋壞。由於地形...

倉庫建設(bzoj 1096)

l公司有n個工廠,由高到底分布在一座山上。如圖所示,工廠1在山頂,工廠n在山腳。由於這座山處於高原內 陸地區 乾燥少雨 l公司一般把產品直接堆放在露天,以節省費用。突然有一天,l公司的總裁l先生接到氣象 部門的 被告知三天之後將有一場暴雨,於是l先生決定緊急在某些工廠建立一些倉庫以免產品被淋壞。由於...

bzoj1096 倉庫建設 斜率優化

dsy1096 zjoi2007 倉庫建設 問題描述 l公司有 n個工廠,由高到底分布在一座山上。如圖所示,工廠 1在山頂,工廠 n在山腳。由於這座山處於高原內陸地區 乾燥少雨 l公司一般把產品直接堆放在露天,以節省費用。突然有一天,l公司的總裁 l先生接到氣象部門的 被告知三天之後將有一場暴雨,於...