Description
斜率优化dp学习笔记 洛谷P3915[HNOI2008]玩具装箱toy
栏目:行业资讯 发布时间:2024-07-16
 #include<bits/stdc++.h>  #define ll long long  #define inf 0x7fffffff  #define un unsigned  #define ull un ll  #define int ull  using namespace std;  #define maxn 50009  int n,l,a[maxn];  int

  #include<bits/stdc++.h>

  #define ll long long

  #define inf 0x7fffffff

  #define un unsigned

  #define ull un ll

  #define int ull

  using namespace std;

  #define maxn 50009

  int n,l,a[maxn];

  int f[maxn],g[maxn];

  int q[maxn];

  int Q(int x){return x*x;}

  double Get(un j,un k)//求斜率

  {

  return ((f[j]+Q(g[j])+2*l*g[j])-(f[k]+Q(g[k])+2*l*g[k]))/(double)(g[j]-g[k]);

  }

  signed main()

  {

  scanf("%llu%llu",&n,&l);

  l++;

  int s=1,t=1;

  int K;

  q[s]=0;

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

  {

  scanf("%llu",&g[i]);

  g[i]=g[i]+g[i-1];

  }

  for(int i=1;i<=n;i++)g[i]+=i;

  for(int i=1;i<=n;q[++t]=i++)

  {

  K=g[i]<<1;

  while(s<t&&Get(q[s+1],q[s])<=K) s++;

  int j=q[s];

  f[i]=f[j]+Q(g[i]-g[j]-l);

  while(s<t&&Get(q[t],q[t-1])>=Get(i,q[t]))t--;

  }

  printf("%llu

  ",f[n]);

  return 0;

  }