首先对于这个题目。

qwq

存在一个性质就是,最终的答案只跟你的分割的位置有关,而和顺序无关。

举一个小栗子

\(a\ b\ c\)

将这个东西分成两块。

如果我们先分割\(ab\)之间的话,\(ans = a*(b+c) + b*c\)

如果先分割\(bc\)之间的话,\(ans=c*(a+b)+a*b\)

答案是一样的。(也可以理解成如果位置,两数相乘的次数是一定的)

那么得到这个结论之后

也就不难得出\(dp\)柿子了

\[dp[i][p]=max(dp[j][p-1]+(sum[i] + sum[j])\times sum[j])
\]

设\(f[x]=dp[x]-sum[x]*sum[x]\)

经过推柿子$$\frac{f[j]-f[k]}{sum[j]-sum[k]} > -sum[i]$$

然后直接上斜率优化

// luogu-judger-enable-o2
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<queue>
#include<map>
#include<set>
#define mk make_pair
#define ll long long
using namespace std;
inline int read()
{
int x=0,f=1;char ch=getchar();
while (!isdigit(ch)) {if (ch=='-') f=-1;ch=getchar();}
while (isdigit(ch)) {x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}
return x*f;
}
const int maxn = 1e5+1e2;
struct Point
{
ll x,y;
int num;
};
ll chacheng(Point x,Point y)
{
return x.x*y.y-x.y*y.x;
}
bool count(Point i,Point j,Point k)
{
Point x,y;
x.x=k.x-i.x;
x.y=k.y-i.y;
y.x=k.x-j.x;
y.y=k.y-j.y;
if (chacheng(x,y)>=0) return true;
return false;
}
struct Node{
Point q[maxn];
ll head=1,tail=0;
void push(Point x)
{
while (tail>=head+1 && count(q[tail-1],q[tail],x)) tail--;
q[++tail]=x;
}
void pop(int lim)
{
while (tail>=head+1 && (q[head+1].y-q[head].y > lim * (q[head+1].x-q[head].x))) head++;
}
};
Node q[210];
ll sum[maxn];
int n,k;
ll dp[2][210];
int pos[100010][210];
int main()
{
n=read();k=read();
k++;
for (int i=1;i<=n;i++) sum[i]=read();
for (int i=1;i<=n;i++) sum[i]+=sum[i-1];
q[0].push((Point){0,0,0});
for (int i=1;i<=n;i++)
{
for (int j=1;j<=min(i,k);j++)
{
q[j-1].pop((-1)*sum[i]);
Point now = q[j-1].q[q[j-1].head];
dp[i&1][j]=now.y+now.x*now.x+(sum[i]-now.x)*now.x;
pos[i][j]=now.num;
q[j].push((Point){sum[i],dp[i&1][j]-sum[i]*sum[i],i});
}
}
cout<<dp[n&1][k]<<endl;
for (int i=n,j=k;i && j>1;i=pos[i][j],j--)
cout<<pos[i][j]<<" ";
cout<<endl;
return 0;
}

最新文章

  1. GCD中的dispatch_barrier_async函数的使用(栅栏函数)
  2. hiho一下 第一百零七周 Give My Text Back(微软笔试题)
  3. malloc原理和内存碎片
  4. 【mysql】mysql分表和表分区详解
  5. Silverlight 独立存储(IsolatedStorageFile)
  6. Struts2配置之Struts.properties
  7. php导出word(可包含图片)
  8. 根据指定的commit查找对应的log
  9. Jqure实现下拉多选
  10. VMware WorkStation安装时提示The MSI failed
  11. com.google.common.collect.Lists#transform使用注意
  12. C: define many functions using predefine..
  13. Python之父重回决策层,社区未来如何发展?
  14. [转] 微信小程序之生命周期
  15. TTL是什么意思?
  16. [android]android Task 任务 简介
  17. vscode 的 vue模板
  18. Linux内核分析作业 NO.5
  19. 算法笔记_178:历届试题 邮局(Java)
  20. Python 以指定列宽格式化字符串

热门文章

  1. HCNP Routing&amp;Switching之OSPF LSA类型
  2. zigzag走线原理及应用
  3. Java HashMap工作原理:不仅仅是HashMap
  4. vue 双向绑定(v-model 双向绑定、.sync 双向绑定、.sync 传对象)
  5. Appium问题解决方案(10)- Original error: Swipe did not complete successfully
  6. Haproxy搭建web集群
  7. [第九篇]——Docker 镜像使用之Spring Cloud直播商城 b2b2c电子商务技术总结
  8. type switch使用
  9. Lombok中@Data注解的坑
  10. python中reduce filter map lambda函数