洛谷传送门

题目大意:让你把序列切割k次,每次切割你能获得 这一整块两侧数字和的乘积 的分数,求最大的分数并输出切割方案

神题= =

搞了半天也没有想到切割顺序竟然和答案无关...我太弱了

证明很简单,就是乘法分配律,把式子展开就行了

定义$s_{i}$为序列$a$的前缀和,定义$f[k][i]$表示第$k$次切割是在第$i$个位置的后面,$f[k][i]=max(f[k-1][j]+(s_{i}-s_{j})*(s_{n}-s_{i}))$

展开式子,移项,发现$x$递增,斜率$k$也递增,用队列维护上凸包就行了

至于记录方案,另开一个数组,记录从哪转移来的就行了

复杂度$O(nk)$

又没长记性把$i$打成$j$了(捂脸)

 #include <cmath>
#include <queue>
#include <vector>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define N1 101000
#define M1 205
#define ll long long
#define dd double
#define uint unsigned int
#define idx(X) (X-'0')
using namespace std; int gint()
{
ll ret=;int fh=;char c=getchar();
while(c<''||c>''){if(c=='-')fh=-;c=getchar();}
while(c>=''&&c<=''){ret=ret*+c-'';c=getchar();}
return ret*fh;
}
int n,K;
int a[N1];
ll sa[N1],f[][N1],x[N1],y[N1];
int fa[M1][N1];
int que[N1],ret[N1]; int main()
{
freopen("t2.in","r",stdin);
scanf("%d%d",&n,&K);
for(int i=;i<=n;i++)
a[i]=gint(),sa[i]=sa[i-]+a[i];
int now=,pst=;
for(int k=;k<=K;k++)
{
int hd=,tl=,j;
que[++tl]=;
for(int i=;i<n;i++)
{
while(hd+<=tl&&(y[que[hd+]]-y[que[hd]])>=-(x[que[hd+]]-x[que[hd]])*sa[i])
hd++;
j=que[hd];
f[now][i]=f[pst][j]+(sa[i]-sa[j])*(sa[n]-sa[i]);
fa[k][i]=j;
x[i]=sa[i],y[i]=f[pst][i]-sa[i]*sa[n];
while(hd+<=tl&&(y[i]-y[que[tl-]])*(x[que[tl]]-x[que[tl-]])>=(y[que[tl]]-y[que[tl-]])*(x[i]-x[que[tl-]]))
tl--;
que[++tl]=i;
}swap(now,pst);
}
ll ans=,id=;
for(int i=;i<n;i++)
if(f[pst][i]>ans)
ans=f[pst][i],id=i;
for(int k=K;k>=;k--)
ret[k]=id,id=fa[k][id];
printf("%lld\n",ans);
for(int k=;k<=K;k++)
printf("%d ",ret[k]);
puts("");
return ;
}

最新文章

  1. hdoj 2075 A|B?
  2. Java总结——文件&amp;流
  3. 安装postgreSQL出现configure:error:readline library not found解决方法
  4. Fragemnt
  5. select unit_timestamp(); 和select unit_timestamp(&quot;1970-1-1 08:00:00&quot;)和 select from_unixtime(1)
  6. JavaScript原生数组函数
  7. linker command failed with exit code 1 (use -v to see
  8. Eclipse添加struts2
  9. 19 主线程向子线程发送信息(handler)
  10. 如何通过jQuery获取一个没有定高度的元素---------的自适应高度(offsetHeight的正确使用方法)
  11. linux学习:归档,备份及进程相关命令用法整理
  12. 简单gulp.js
  13. 【待补充】[HDFS_3] HDFS 工作机制
  14. C++进阶--逻辑常数和比特位常数(Logical constness vs Bitwise constness)
  15. GoLang学习控制语句之字符串
  16. 利用NtQuerySystemInformation函数遍历进程,遍历线程,获取线程挂起或运行状态
  17. Java查找算法之二分查找
  18. maven 项目 编码
  19. jdbc调试sql语句方法
  20. 【LaTeX】E喵的LaTeX新手入门教程(6)中文

热门文章

  1. 封装基于jq弹窗插件
  2. Elasticsearch 入门 - 安装、启动和配置
  3. hibernate框架总结
  4. 简洁又快速地处理集合——Java8 Stream(下)
  5. Ruby中使用patch HTTP方法
  6. centos7.0 安装日志--图文具体解释-python开发环境配置
  7. 从C到C++(下)
  8. MFC窗口去边框、置顶、全屏、激活
  9. MFC C++ 获取外网IP地址
  10. TLS握手