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. One example to understand SemFix: Program Repair via Semantic Analysis

    One example to understand SemFix: Program Repair via Semantic Analysis Basic Information Authors: Ho ...

  2. Factory——工厂方法

    一.定义 GOF上对工厂方法的意图如此描述:定义一个用于创建对象的接口,让子类决定实例化哪个类.Factory Method使一个类的实例化延迟到其子类. 作为类的开发者,我们通常会在类中提供构造器方 ...

  3. LeetCode - Subarray sum equals k

    Given an array of integers and an integer k, you need to find the total number of continuous subarra ...

  4. js设计模式(五)---观察者模式

    概述: 观察者模式也叫 “ 发布-订阅 " 模式 , 发布者发布信息是不需要考虑订阅者是谁?添加订阅者的时候也不需要通知发布者. 应用: 最经典的就是: DOM事件 开发过程中我们常用自定义 ...

  5. 这 10 款良心 Windows 软件,改变你对国产的认知

    提起国产 Windows 软件,你可能首先想到的是捆绑安装.弹窗广告.卸载残留等关键词.尽管一些所谓「大厂」的确致力于拉低业界的下限,但依然有开发者坚守底线,为改变整个生态圈而默默努力.今天,少数派就 ...

  6. 记一次windows服务开发中遇到的问题

    最近在研究windows service和quartz.net,所以迅速在园子大神那里扒了一个demo,运行,安装一切顺利. 但在在App.config配置中增加了数据库连接字符串配置后,服务安装后无 ...

  7. Luogu 1023 - 税收与补贴问题 - [数学题]

    题目链接:https://www.luogu.org/problemnew/show/P1023 题目背景每样商品的价格越低,其销量就会相应增大.现已知某种商品的成本及其在若干价位上的销量(产品不会低 ...

  8. Docker数据卷

    1.volume操作命名:docker volume Usage:    docker volume COMMAND Manage Docker volumes Options:       --he ...

  9. InnoDB中锁的算法(1)

    Ⅰ.InnoDB锁算法的介绍 首先明确一点,锁锁住的是什么?锁锁住的是索引 Record Lock 单个行记录上的锁 Gap Lock 锁定一个范围,但不包含记录本身 Next-key Lock Ga ...

  10. PHP计算年龄

    <?php $birthday = strtotime('1992-10-03'); $time = time();//2019-03-14; function datediffage($bir ...