P3648 [APIO2014]序列分割

我们先证明,分块的顺序对结果没有影响。

我们有一个长度为3的序列$abc$

现在我们将$a,b,c$分开来

随意枚举一种分块方法,如$(ab)(c)$,$(a)(b)(c)$

答案为$(a+b)*c+a*b=ac+bc+ab$

多枚举几种,我们发现答案总是不变的。

所以我们可以默认每次从左到右扫,用dp求解

对于每个$1$到$k$,我们都把序列扫一遍

设$f[k][i]$为对前$i$个数进行$k$次切割的最大价值,

$s[i]$为元素前缀和,那么

$f[k][i]=f[k-1][j]+s[j]*(s[i]-s[j])$

这个$k$显然是可以滚动优化掉的,设滚动数组为$g[i]$

$f[i]=g[j]+s[j]*(s[i]-s[j])$

$g[j]-s[j]^{2}=-s[i]*s[j]+f[i]$

又化成了我们熟悉的$y=kx+b$

$y=g[j]-s[j]^{2}$

$k=-s[i]$

$x=s[j]$

$b=f[i]$

$x,k$单调递增,于是我们直接上单调队列维护下凸包就好辣

顺带再开个数组记录一下路径就好了

#include<iostream>
#include<cstdio>
#include<cstring>
#define rint register int
using namespace std;
typedef long long ll;
#define N 100005
ll s[N],f[N],g[N];
int n,k,L,R,h[N],p[][N];
inline ll X(int x){return s[x];}
inline ll Y(int x){return g[x]-s[x]*s[x];}
inline ll KK(ll xa,ll ya,ll xb,ll yb){return ya*xb-yb*xa;}
int main(){
scanf("%d%d",&n,&k);
for(rint i=;i<=n;++i)
scanf("%lld",&s[i]),s[i]+=s[i-];
for(rint j=;j<=k;++j){
h[L=R=]=;
for(rint i=;i<=n;++i){
while(L<R&&KK(X(h[L+])-X(h[L]),Y(h[L+])-Y(h[L]),,-s[i])>=) ++L;
f[i]=g[h[L]]+(s[i]-s[h[L]])*s[h[L]]; p[j][i]=h[L];
while(L<R&&KK(X(h[R])-X(i),Y(h[R])-Y(i),X(h[R])-X(h[R-]),Y(h[R])-Y(h[R-]))<=) --R;
h[++R]=i;
}swap(g,f);
}
printf("%lld\n",g[n]);//注意答案在g上
for(rint i=k,d=p[k][n];i;--i,d=p[i][d]) printf("%d ",d);
return ;
}

P3648 [APIO2014]序列分割(斜率优化dp)的更多相关文章

  1. bzoj3675[Apio2014]序列分割 斜率优化dp

    3675: [Apio2014]序列分割 Time Limit: 40 Sec  Memory Limit: 128 MBSubmit: 3508  Solved: 1402[Submit][Stat ...

  2. [APIO2014]序列分割 --- 斜率优化DP

    [APIO2014]序列分割 题目大意: 你正在玩一个关于长度为\(n\)的非负整数序列的游戏.这个游戏中你需要把序列分成\(k+1\)个非空的块.为了得到\(k+1\)块,你需要重复下面的操作\(k ...

  3. 【bzoj3675】[Apio2014]序列分割 斜率优化dp

    原文地址:http://www.cnblogs.com/GXZlegend/p/6835179.html 题目描述 小H最近迷上了一个分隔序列的游戏.在这个游戏里,小H需要将一个长度为n的非负整数序列 ...

  4. P3648 [APIO2014]序列分割 斜率优化

    题解:斜率优化\(DP\) 提交:\(2\)次(特意没开\(long\ long\),然后就死了) 题解: 好的先把自己的式子推了出来: 朴素: 定义\(f[i][j]\)表示前\(i\)个数进行\( ...

  5. BZOJ 3675 [Apio2014]序列分割 (斜率优化DP)

    洛谷传送门 题目大意:让你把序列切割k次,每次切割你能获得 这一整块两侧数字和的乘积 的分数,求最大的分数并输出切割方案 神题= = 搞了半天也没有想到切割顺序竟然和答案无关...我太弱了 证明很简单 ...

  6. BZOJ 3675 APIO2014 序列切割 斜率优化DP

    题意:链接 方法:斜率优化DP 解析:这题BZ的数据我也是跪了,特意去网上找到当年的数据后面二十个最大的点都过了.就是过不了BZ. 看到这道题自己第一发DP是这么推得: 设f[i][j]是第j次分第i ...

  7. 【BZOJ3675】【APIO2014】序列分割 [斜率优化DP]

    序列分割 Time Limit: 40 Sec  Memory Limit: 128 MB[Submit][Status][Discuss] Description 小H最近迷上了一个分隔序列的游戏. ...

  8. BZOJ3675: [Apio2014]序列分割(斜率优化)

    Time Limit: 40 Sec  Memory Limit: 128 MBSubmit: 4186  Solved: 1629[Submit][Status][Discuss] Descript ...

  9. BZOJ 3675: 序列分割 (斜率优化dp)

    Description 小H最近迷上了一个分隔序列的游戏.在这个游戏里,小H需要将一个长度为n的非负整数序列分割成k+1个非空的子序列.为了得到k+1个子序列,小H需要重复k次以下的步骤: 1.小H首 ...

随机推荐

  1. 114、drawable和mipmap 目录下图片的区别

    android 在 API level 17 加入了 mipmap 技术,对 bitmap 图片的渲染支持 mipmap 技术,来提高渲染的速度和质量.mipmap 是一种很早就有的技术了,翻译过来就 ...

  2. java基础---->String和MessageFormat的format方法

    这里介绍一下String和MessageFormat中的format方法的差异以及实现原理. String与MessageFormat的说明 一.两者的使用场景 String.format:for l ...

  3. Node bak

    process.on('uncaughtException', function (err) { logger.info('Local Server Exception: ') logger.info ...

  4. 【1】public

    [面向对象] 李坤是不是人?(人类) 飞飞是不是人?(人类) 扎心是不是人?(人类) 是:特指某一个事物 属于:同一的类型 什么是对象: 就是特指的某一个东西,万物皆对象 什么是类: 具有一批相同属性 ...

  5. JavaScript Promise:去而复返

    原文:http://www.html5rocks.com/en/tutorials/es6/promises/ 作者:Jake Archibald 翻译:Amio 女士们先生们,请准备好迎接 Web ...

  6. 怎么访问不在网站目录下文件(iis虚拟目录设置)

    很多时候,上传的文件多了,架设服务器当初设定的主目录所在盘空间往往就不够了,怎么办?这就需要设置虚拟目录.虚拟目录就是将其他目录以映射的方式虚拟到该FTP服务器的主目录下,这样,一个FTP服务器的主目 ...

  7. swust oj 1015

    堆排序算法 1000(ms) 10000(kb) 2631 / 5595 编写程序堆排序算法.按照从小到大的顺序进行排序,测试数据为整数. 输入 第一行是待排序数据元素的个数: 第二行是待排序的数据元 ...

  8. Kafka的安装是否成功的简单测试命令

    首先了解一下kafka的基本概念 .1. BrokerKafka集群包含一个或多个服务器,这种服务器被称为broker2. Topic每条发布到Kafka集群的消息都有一个类别,这个类别被称为Topi ...

  9. python语法_字符类型

    str(string): 字符串   str(被转换的数据) int(interger):整数   int(被转换的数据)

  10. ELK之使用heartbeat监控WEB站点

    简介 无论您要测试同一台主机上的服务,还是要测试开放网络上的服务,Heartbeat 都能轻松生成运行时间数据和响应时间数据 Heartbeat 能够通过 ICMP.TCP 和 HTTP 进行 pin ...