
显然的斜率优化模型
但是单调队列维护斜率单调性的时候出现了莫名的锅orz
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
|
#include <algorithm> #include <cstring> #include <deque> #define int long long using namespace std; int a[500100],dp[500100],n,m,sum[500100],q[500100],h=1,t=0; int (int x){ return dp[x]+sum[x]*sum[x]; } signed main(){ while(scanf("%lld %lld",&n,&m)==2){ dp[0]=0; sum[0]=0; h=0,t=0; for(int i=1;i<=n;i++) scanf("%d",&a[i]),sum[i]=sum[i-1]+a[i]; q[t++]=0; for(int i=1;i<=n;i++){ while(h+1<t&&(f(q[h+1])-f(q[h]))<=2*sum[i]*(sum[q[h+1]]-sum[q[h]])) h++; dp[i]=dp[q[h]]+(sum[i]-sum[q[h]])*(sum[i]-sum[q[h]])+m; while(h+1<t&&(sum[q[t-1]]-sum[q[t-2]])*(f(i)-f(q[t-1]))<=(f(q[t-1])-f(q[t-2]))*(sum[i]-sum[q[t-1]])) t--; q[t++]=i; } printf("%lldn",dp[n]); } return 0; }
|
近期评论