题解:斜率优化\(DP\)

提交:\(2\)次(特意没开\(long\ long\),然后就死了)

题解:

好的先把自己的式子推了出来:

朴素:

定义\(f[i][j]\)表示前\(i\)个数进行\(j\)次切割的最大得分,\(s[i]\)为前缀和

那么转移方程为:

\(f[i][j]=\max(f[i-1][j]+s[j]*(s[i]-s[j]))\)

优化一下(省掉第一维):

\(f[i]=\max(mem[j]+s[j]*(s[i]-s[j])\),\(f[j])\),\(mem[j]\)相当于\(f[i-1][j]\)

换成斜率优化的式子:

\(mem[j]-s[j]^2=-s[i]*s[j]+f[i]\)

求\(f[i]\)最大值,所以维护上凸包;斜率\(-s[i]\)单调递减,所以一个单调队列维护凸包。

然后康了一眼别人的题解:维护下凸包?

???黑人问号.jpg

后来发现自己就是个傻子:自己的是对的,只不过斜率那里和他们的相比少乘了个\(-1\)

\(ou\)。。那就没事了

(所以我写的还是自己的)

#include<cstdio>
#include<iostream>
#include<cstring>
#define R register int
#define ll long long
using namespace std;
namespace Luitaryi {
template<class I> inline I g(I& x) { x=0;
register I f=1; register char ch; while(!isdigit(ch=getchar())) f=ch=='-'?-1:f;
do x=x*10+(ch^48); while(isdigit(ch=getchar())); return x*=f;
} const int N=100010;
int n,k,h,t,q[N],pre[210][N];
ll f[N],mem[N],s[N];
inline int X(int i) {return s[i];}
inline ll Y(int i) {return mem[i]-s[i]*s[i];}
inline double K(int i,int j) {return 1.0*(Y(i)-Y(j))/(X(i)==X(j)?-1e-12:X(i)-X(j));}
inline void main() {
g(n),g(k); for(R i=1,x;i<=n;++i) g(x),s[i]=s[i-1]+x;
for(R i=1;i<=k;++i) { h=t=0;
for(R j=1;j<=n;++j) {
while(h<t&&K(q[h],q[h+1])>=-s[j]) ++h;
f[j]=mem[q[h]]+1ll*s[q[h]]*s[j]-1ll*s[q[h]]*s[q[h]];
pre[i][j]=q[h];
while(h<t&&K(q[t-1],j)<=K(q[t],j)) --t; q[++t]=j;
} memcpy(mem,f,sizeof(f));
} printf("%lld\n",f[n]);
for(R i=k,j=n;i;--i) j=pre[i][j],printf("%d ",j); puts("");
}
} signed main() {Luitaryi::main(); return 0;}

2019.08.17

83

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

  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]序列分割(斜率优化)

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

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

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

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

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

  6. P3648 [APIO2014]序列分割(斜率优化dp)

    P3648 [APIO2014]序列分割 我们先证明,分块的顺序对结果没有影响. 我们有一个长度为3的序列$abc$ 现在我们将$a,b,c$分开来 随意枚举一种分块方法,如$(ab)(c)$,$(a ...

  7. [luogu P3648] [APIO2014]序列分割

    [luogu P3648] [APIO2014]序列分割 题目描述 小H最近迷上了一个分隔序列的游戏.在这个游戏里,小H需要将一个长度为n的非负整数序列分割成k+1个非空的子序列.为了得到k+1个子序 ...

  8. 洛谷 P3648 [APIO2014]序列分割 解题报告

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

  9. 洛谷P3648 [APIO2014]序列分割(斜率优化)

    传送门 没想到这种多个状态转移的还能用上斜率优化……学到了…… 首先我们可以发现,切的顺序对最终答案是没有影响的 比方说有一个序列$abc$,每一个字母都代表几个数字,那么先切$ab$再切$bc$,得 ...

随机推荐

  1. PAT甲级 树 相关题_C++题解

    树 目录 <算法笔记>重点摘要 1004 Counting Leaves (30) 1053 Path of Equal Weight (30) 1079 Total Sales of S ...

  2. SASS摘要

    SASS提高了代码的重复利用率,提高了效率.不用去记或者查找复杂或者繁琐的参数和书写规则. 这里简单整理了实际业务中常常用到的几个功能. 1. 父元素引用 & a { &:hover ...

  3. CentOS7离线安装Nginx(详细安装过程)

    CentOS7离线安装Nginx(详细安装过程) 1.安装gcc.g++ 下载好所需的文件后上传至服务器(下载地址:https://download.csdn.net/download/a729360 ...

  4. 生成 excel 插件 Epplus

    最近做 .net core 项目 发现一个新的 生成excel 的插件 . 以前值用 aspose 或者 npio. 简介:Epplus是一个使用Open Office XML(Xlsx)文件格式,能 ...

  5. row_number() over()函数基本用法

    简单的说row_number()从1开始,为每一条分组记录返回一个数字,这里的ROW_NUMBER() OVER (ORDER BY xlh DESC) 是先把xlh列降序,再为降序以后的没条xlh记 ...

  6. Opencl 学习笔记

    1. HelloWorld

  7. Apache ---- Solrl漏洞复现

    Solr是一个独立的企业级搜索应用服务器,它对外提供类似于Web-service的API接口.用户可以通过http请求,向搜索引擎服务器提交一定格式的XML文件,生成索引:也可以通过Http Get操 ...

  8. windows开机自动执行bat脚本启动cmd命令窗口并执行命令,最后自动关闭cmd命令窗

    先说bat脚本吧,随便在桌面建一个文本文档,在里面写脚本,内容是,先启动cmd命令窗,并执行一个命令,最后自动关闭cmd窗,如下: ---------------------------------- ...

  9. git 从存储库中删除敏感数据(删除文件历史)

    1.如果您的历史记录中还没有包含敏感数据的存储库的本地副本,请将存储库克隆到本地计算机. git clone https://github.com/YOUR-USERNAME/YOUR-REPOSIT ...

  10. Scrapy 中常用的中间件和管道组件

    Pipeline用法 储存到MongoDB pipline.py中的代码 import pymongo class MongoPipeline(object): def __init__(self, ...