P3648 [APIO2014]序列分割(斜率优化dp)
我们先证明,分块的顺序对结果没有影响。
我们有一个长度为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)的更多相关文章
- bzoj3675[Apio2014]序列分割 斜率优化dp
3675: [Apio2014]序列分割 Time Limit: 40 Sec Memory Limit: 128 MBSubmit: 3508 Solved: 1402[Submit][Stat ...
- [APIO2014]序列分割 --- 斜率优化DP
[APIO2014]序列分割 题目大意: 你正在玩一个关于长度为\(n\)的非负整数序列的游戏.这个游戏中你需要把序列分成\(k+1\)个非空的块.为了得到\(k+1\)块,你需要重复下面的操作\(k ...
- 【bzoj3675】[Apio2014]序列分割 斜率优化dp
原文地址:http://www.cnblogs.com/GXZlegend/p/6835179.html 题目描述 小H最近迷上了一个分隔序列的游戏.在这个游戏里,小H需要将一个长度为n的非负整数序列 ...
- P3648 [APIO2014]序列分割 斜率优化
题解:斜率优化\(DP\) 提交:\(2\)次(特意没开\(long\ long\),然后就死了) 题解: 好的先把自己的式子推了出来: 朴素: 定义\(f[i][j]\)表示前\(i\)个数进行\( ...
- BZOJ 3675 [Apio2014]序列分割 (斜率优化DP)
洛谷传送门 题目大意:让你把序列切割k次,每次切割你能获得 这一整块两侧数字和的乘积 的分数,求最大的分数并输出切割方案 神题= = 搞了半天也没有想到切割顺序竟然和答案无关...我太弱了 证明很简单 ...
- BZOJ 3675 APIO2014 序列切割 斜率优化DP
题意:链接 方法:斜率优化DP 解析:这题BZ的数据我也是跪了,特意去网上找到当年的数据后面二十个最大的点都过了.就是过不了BZ. 看到这道题自己第一发DP是这么推得: 设f[i][j]是第j次分第i ...
- 【BZOJ3675】【APIO2014】序列分割 [斜率优化DP]
序列分割 Time Limit: 40 Sec Memory Limit: 128 MB[Submit][Status][Discuss] Description 小H最近迷上了一个分隔序列的游戏. ...
- BZOJ3675: [Apio2014]序列分割(斜率优化)
Time Limit: 40 Sec Memory Limit: 128 MBSubmit: 4186 Solved: 1629[Submit][Status][Discuss] Descript ...
- BZOJ 3675: 序列分割 (斜率优化dp)
Description 小H最近迷上了一个分隔序列的游戏.在这个游戏里,小H需要将一个长度为n的非负整数序列分割成k+1个非空的子序列.为了得到k+1个子序列,小H需要重复k次以下的步骤: 1.小H首 ...
随机推荐
- 114、drawable和mipmap 目录下图片的区别
android 在 API level 17 加入了 mipmap 技术,对 bitmap 图片的渲染支持 mipmap 技术,来提高渲染的速度和质量.mipmap 是一种很早就有的技术了,翻译过来就 ...
- java基础---->String和MessageFormat的format方法
这里介绍一下String和MessageFormat中的format方法的差异以及实现原理. String与MessageFormat的说明 一.两者的使用场景 String.format:for l ...
- Node bak
process.on('uncaughtException', function (err) { logger.info('Local Server Exception: ') logger.info ...
- 【1】public
[面向对象] 李坤是不是人?(人类) 飞飞是不是人?(人类) 扎心是不是人?(人类) 是:特指某一个事物 属于:同一的类型 什么是对象: 就是特指的某一个东西,万物皆对象 什么是类: 具有一批相同属性 ...
- JavaScript Promise:去而复返
原文:http://www.html5rocks.com/en/tutorials/es6/promises/ 作者:Jake Archibald 翻译:Amio 女士们先生们,请准备好迎接 Web ...
- 怎么访问不在网站目录下文件(iis虚拟目录设置)
很多时候,上传的文件多了,架设服务器当初设定的主目录所在盘空间往往就不够了,怎么办?这就需要设置虚拟目录.虚拟目录就是将其他目录以映射的方式虚拟到该FTP服务器的主目录下,这样,一个FTP服务器的主目 ...
- swust oj 1015
堆排序算法 1000(ms) 10000(kb) 2631 / 5595 编写程序堆排序算法.按照从小到大的顺序进行排序,测试数据为整数. 输入 第一行是待排序数据元素的个数: 第二行是待排序的数据元 ...
- Kafka的安装是否成功的简单测试命令
首先了解一下kafka的基本概念 .1. BrokerKafka集群包含一个或多个服务器,这种服务器被称为broker2. Topic每条发布到Kafka集群的消息都有一个类别,这个类别被称为Topi ...
- python语法_字符类型
str(string): 字符串 str(被转换的数据) int(interger):整数 int(被转换的数据)
- ELK之使用heartbeat监控WEB站点
简介 无论您要测试同一台主机上的服务,还是要测试开放网络上的服务,Heartbeat 都能轻松生成运行时间数据和响应时间数据 Heartbeat 能够通过 ICMP.TCP 和 HTTP 进行 pin ...