日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【BZOJ-3156】防御准备 DP + 斜率优化

發布時間:2024/1/17 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【BZOJ-3156】防御准备 DP + 斜率优化 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

3156: 防御準備

Time Limit:?10 Sec??Memory Limit:?512 MB
Submit:?951??Solved:?446
[Submit][Status][Discuss]

Description

Input

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

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

Output

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

Sample Input

10
2 3 1 5 4 5 6 3 1 2

Sample Output

18

HINT

1<=N<=10^6,1<=Ai<=10^9

Source

Katharon+#1

Solution

斜率優化DP

方案由后面的轉移? 翻轉序列即可..

然后就是轉移方程 $dp[i]=min(dp[i],dp[j]+sum[i-1]-sum[j]-(i-j-1)*j+A[i]$

然后斜率優化一下,比較的裸,然后即可

值得注意的地方:

轉移的時候,$i=1$提前的處理出來..

在計算答案的時候,注意加long long否則會WA成狗..

Code

#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #include<cmath> using namespace std; int read() {int x=0,f=1; char ch=getchar();while (ch<'0' || ch>'9') {if (ch=='-') f=-1; ch=getchar();}while (ch>='0' && ch<='9') {x=x*10+ch-'0'; ch=getchar();}return x*f; } #define maxn 1000100 int n,A[maxn]; int que[maxn],l,r; long long dp[maxn],sumid[maxn],ans; double slope(long long i,long long j) {return (double)(dp[i]-dp[j]-sumid[i]+sumid[j]+i-j+i*i-j*j)/(double)(i-j);} int main() {n=read(); ans=(long long)1<<60;for (int i=n; i>=1; i--) A[i]=read();for (int i=1; i<=n; i++) sumid[i]=sumid[i-1]+i;dp[1]=A[1]; que[1]=1; l=r=1;for (int tmp,i=2; i<=n; i++){while (l<r && slope(que[l],que[l+1])<i) l++;tmp=que[l];dp[i]=dp[tmp]+sumid[i-1]-sumid[tmp]-(i-tmp-1)*tmp+A[i];while (l<r && slope(que[r],i)<slope(que[r-1],que[r])) r--;que[++r]=i;}for (int i=1; i<=n; i++) ans=min(ans,dp[i]+sumid[n]-sumid[i]-(long long)(n-i)*i);printf("%lld\n",ans);return 0; }

上文所述WA成狗...MDZZ

轉載于:https://www.cnblogs.com/DaD3zZ-Beyonder/p/5388392.html

總結

以上是生活随笔為你收集整理的【BZOJ-3156】防御准备 DP + 斜率优化的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。