[BZOJ3675]序列分割
3675: [Apio2014]序列分割
Time Limit: 40 Sec Memory Limit: 128 MB
Description
Input
输入第一行包含两个整数n,k(k+1≤n)。
Output
输出第一行包含一个整数,为小H可以得到的最大分数。
Sample Input
4 1 3 4 0 2 3
Sample Output
HINT
【样例说明】
在样例中,小H可以通过如下3轮操作得到108分:
1.-开始小H有一个序列(4,1,3,4,0,2,3)。小H选择在第1个数之后的位置
将序列分成两部分,并得到4×(1+3+4+0+2+3)=52分。
2.这一轮开始时小H有两个序列:(4),(1,3,4,0,2,3)。小H选择在第3个数
字之后的位置将第二个序列分成两部分,并得到(1+3)×(4+0+2+
3)=36分。
3.这一轮开始时小H有三个序列:(4),(1,3),(4,0,2,3)。小H选择在第5个
数字之后的位置将第三个序列分成两部分,并得到(4+0)×(2+3)=
20分。
经过上述三轮操作,小H将会得到四个子序列:(4),(1,3),(4,0),(2,3)并总共得到52+36+20=108分。
【数据规模与评分】
:数据满足2≤n≤100000,1≤k≤min(n -1,200)。
题解:
首先通过手推可以发现,得到的价值和切割顺序无关(小栗子:把序列切成3段①②③的话,(①+②)*③+①*②=①*(②+③)+②*③)
这样的话本题就可以从左到右扫了.我们设f[i][j]为在j这个点切i次最大价值,s[i]为前缀和
对于某一个切割点j,考虑上一个切割点k,有f[i][j]=max{f[i-1][k]+s[k]*(s[j]-s[k]),k∈[1,j)}
这个方程又对应着一个简单的O(N2K)暴力
for(int i=;i<=k+;i++)
{
for(int j=;j<=n;j++)
for(int u=;u<j;u++)
f[j]=max(f[j],g[u]+(s[j]-s[u])*s[u]);
for(int j=;j<=n;j++)
swap(f[j],g[j]);
}
printf("%lld",f[n]);
一个简单的暴力
但考虑到数据范围,这样的暴力无疑会T,因此考虑优化.
首先,无论哪种打法都要开滚动数组,不然会内存爆炸.设滚动数组为g[i]
对于两个决策点k1<k2,如果k2优于k1
则g[k1]+s[k1]*(s[j]-s[k1])<g[k2]+s[k2]*(s[j]-s[k2])
g[k1]-g[k2]<s[k2]*(s[j]-s[k2])-s[k1]*(s[j]-s[k1])
g[k1]-g[k2]<s[k2]*s[j]-s[k1]*s[j]+s[k1]2-s[k2]2
g[k1]-g[k2]+s[k2]2-s[k1]2<s[j]*(s[k2]-s[k1])
(g[k1]-g[k2]+s[k2]2-s[k1]2)/(s[k2]-s[k1])<s[j]
这样我们又得到了一个可爱的斜率式子
那么我们利用这个式子计算就好了~
代码见下:
#include<cstdio>
#include<cstring>
using namespace std;
typedef long long LL;
const int N=;
const int K=;
int n,k,q[N],a[N],now=,pre=;
LL f[][N],s[N];
inline double l(int k1,int k2){return 1.0*(f[pre][k1]-f[pre][k2]+s[k2]*s[k2]-s[k1]*s[k1])/(s[k2]-s[k1]);}
int main()
{
scanf("%d%d",&n,&k);int tmp=;
for(int i=;i<=n;i++)
scanf("%lld",&a[i]);
for(int i=;i<=n;i++)if(a[i])a[++tmp]=a[i];;
n=tmp;
for(int i=;i<=n;i++)s[i]=a[i]+s[i-];
for(int i=,h=,t=;i<=k;i++,h=,t=)
{
memset(q,,sizeof(q));
for(int j=i;j<=n;j++)
{
while(h<t&&l(q[t-],q[t])>l(q[t],j-))t--;
q[++t]=j-;
while(h<t&&l(q[h],q[h+])<s[j])h++;
f[now][j]=f[pre][q[h]]+(s[j]-s[q[h]])*s[q[h]];
}
pre^=,now^=;
}
printf("%lld",f[pre][n]);
}
BZOJ3675
[BZOJ3675]序列分割的更多相关文章
- 【bzoj3675】 Apio2014—序列分割
http://www.lydsy.com/JudgeOnline/problem.php?id=3675 (题目链接) 题意 给出一个包含n个非负整数的序列,要求将其分割成k+1个序列,每次分割可以获 ...
- 【BZOJ3675】序列分割(斜率优化,动态规划)
[BZOJ3675]序列分割(斜率优化,动态规划) 题面 Description 小H最近迷上了一个分隔序列的游戏.在这个游戏里,小H需要将一个长度为n的非负整数序列分割成k+1个非空的子序列.为了得 ...
- BZOJ3675 [Apio2014]序列分割 动态规划 斜率优化
原文链接http://www.cnblogs.com/zhouzhendong/p/8697258.html 题目传送门 - BZOJ3675 题意 对于一个非负整数序列,小H需要重复k次以下的步骤: ...
- 【BZOJ-3675】序列分割 DP + 斜率优化
3675: [Apio2014]序列分割 Time Limit: 40 Sec Memory Limit: 128 MBSubmit: 1420 Solved: 583[Submit][Statu ...
- bzoj3675[Apio2014]序列分割 斜率优化dp
3675: [Apio2014]序列分割 Time Limit: 40 Sec Memory Limit: 128 MBSubmit: 3508 Solved: 1402[Submit][Stat ...
- BZOJ3675 Apio2014 序列分割 【斜率优化】
Description 小H最近迷上了一个分隔序列的游戏.在这个游戏里,小H需要将一个长度为n的非负整数序列分割成k+1个非空的子序列.为了得到k+1个子序列,小H需要重复k次以下的步骤: 1.小H首 ...
- BZOJ3675: [Apio2014]序列分割(斜率优化)
Time Limit: 40 Sec Memory Limit: 128 MBSubmit: 4186 Solved: 1629[Submit][Status][Discuss] Descript ...
- BZOJ3675 & 洛谷3648 & UOJ104:[Apio2014]序列分割——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=3675 https://www.luogu.org/problemnew/show/P3648 ht ...
- BZOJ3675 [Apio2014]序列分割 【斜率优化dp】
3675: [Apio2014]序列分割 Time Limit: 40 Sec Memory Limit: 128 MB Submit: 3366 Solved: 1355 [Submit][St ...
随机推荐
- 运行出错之未能加载文件或程序集“Microsoft.ReportViewer.Common, Version=12.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91”或它的某一个依赖项。系统找不到指定的文件。文件名:“Microsoft.ReportViewer.Common, Version=11.0.0.0,
这个问题是因为在项目中缺少Microsoft.ReportViewer.Common程序集. 方法一:缺少哪些文件或程序集,到程序开发计算机下找到对应的烤到客户端的程序启动目录下即可(项目烤到Bin\ ...
- 基于Activiti的流程应用开发平台JSAAS-WF V5.3
第1章 产品概述及体系架构 1.1.概述 红迅JSAAS-WF工作流平台V5是广州红迅软件有限公司面向合作伙伴以及有IT运维团队中大型企业提供新一代的流程管理产品,它基于流行的JAVA开源技术上构建, ...
- CTF中怎看phpinfo
CTF中怎么看phpinfo 在比赛中经常遇到phpinfo,这个页面可以看到很多配置信息,我们需要在这么多信息中,着重看一下几个内容: 1.allow_url_fopen和allow_url_inc ...
- 腾讯QQAndroid API调用实例(QQ分享无需登录)
腾讯QQAndroid API调用实例(QQ分享无需登录) 主要分为两个步骤: 配置Androidmanifest.xml 修改activity里边代码 具体修改如下: 1.Activity代 ...
- Google的PageRank及其Map-reduce应用(日志五)
上一篇:Hadoop的安装(日志四) 1,算法的原理解释: 如下图所示,G就是传说中的谷歌矩阵,这个矩阵是n*n型号的,n表示共计有n个网页. 如矩阵中所示: 11位置处的元素,是表示第一个网页指向的 ...
- ajax返回json数据示例
前端发送请求与接收数据: $.ajax({ type : "post", url : "/queryStudent", ...
- OC—可变数组NSMutableArray
- JAVA 基础之Integer
jdk1.5后增加了自动拆箱和自动装箱特性.java的八种 byte,short,int,long,float,double,char,boolean基本类型和各自对应的包装类型的相互转化. 装箱指的 ...
- 超实用Java快捷键
超实用Java快捷键 Ctrl+1或F2快速修复 Ctrl+D快捷删除行 Shift+Enter 快速切换到下一行,在本行的任何位置都可 Ctrl+F11快速运行代码 Alt+上下键 快速移动行(可多 ...
- MySQL · 引擎特性 · InnoDB Buffer Pool
前言 用户对数据库的最基本要求就是能高效的读取和存储数据,但是读写数据都涉及到与低速的设备交互,为了弥补两者之间的速度差异,所有数据库都有缓存池,用来管理相应的数据页,提高数据库的效率,当然也因为引入 ...