【BZOJ3675】【Apio2014】序列分割
Description
Solution
之前我也遇到过一次这种“两段之和乘积作为贡献“的问题:考虑把这一种\((\sum) *(\sum)\)的形式拆括号,就可以发现贡献其实就是分别处于左右的两两元素乘积之和。
题目的分割\(k\)次,其实就是要你把序列分成\(k+1\)段。
再考虑在题目中如此的分割方法下,贡献是怎么产生的。对于每一个元素\(a_i\),每次分割时,若涉及到自己,则会贡献一定的乘积\(a_i(\sum)\)。细心想一想就会发现,这个\(\sum\)的总值就是在最终方案下不处于\(a_i\)所在段的元素之和。
单向考虑每一项乘积,(这里有点跳)总的来算,每一段\([l,r]\)的贡献就是\((\sum_{i=l}^ra_i)(\sum_{i=1}^{l-1}a_i)\)。记\(a\)的前缀和为\(s\),则贡献是\((s_r-s_{l-1})s_{l-1}\).
我们可以写出DP式,\(f_{i,j}\)表示前\(i\)个数恰好分成\(j\)段的贡献最大值:
\]
直接DP是\(\mathcal O((k+1)n^2)\)的。而看到这个式子比较简单,考虑斜率优化。这里省去第二维,整体做\(k+1\)次即可。
设\(k<j<i\),\(j\)比\(k\)优,则有:
f_j+(s_i-s_j)s_j&>f_{k}+(s_i-s_k)s_k\\
f_j+s_is_j-s_j^2&>f_k+s_is_k-s_k^2\\
s_i(s_j-s_k)&>(s_j^2-f_j)-(s_k^2-f_k)\\
\frac{(s_j^2-f_j)-(s_k^2-f_k)}{(s_j-s_k)}&<s_i
\end{aligned}
\]
直接做就可以了。
Code
#include <cstdio>
#include <iostream>
using namespace std;
typedef long long ll;
const int N=100005;
const ll INF=1LL<<62;
const double EPS=1e-6;
int n,m,a[N];
int q[N],head,tail;
ll s[N],real_f[N],real_g[N],*f=real_f,*g=real_g;
inline double slope(int a,int b){
return 1.0*((s[b]*s[b]-g[b])-(s[a]*s[a]-g[a]))/(s[b]-s[a]);
}
int main(){
scanf("%d%d",&n,&m);
int cnt=0;
for(int i=1,x;i<=n;i++){
scanf("%d",&x);
if(x)
cnt++,s[cnt]=s[cnt-1]+x;
}
n=cnt; m=min(m,n-1)+1;
for(int j=2;j<=m;j++){
q[head=tail=1]=j-1;
for(int i=j;i<=n;i++){
while(head<tail&&slope(q[head],q[head+1])-EPS<s[i]) head++;
int best=q[head];
f[i]=g[best]+(s[i]-s[best])*s[best];
while(head<tail&&slope(q[tail-1],q[tail])>slope(q[tail],i)) tail--;
q[++tail]=i;
}
swap(f,g);
}
printf("%lld\n",g[n]);
return 0;
}
【BZOJ3675】【Apio2014】序列分割的更多相关文章
- bzoj3675[Apio2014]序列分割 斜率优化dp
3675: [Apio2014]序列分割 Time Limit: 40 Sec Memory Limit: 128 MBSubmit: 3508 Solved: 1402[Submit][Stat ...
- BZOJ3675 [Apio2014]序列分割 【斜率优化dp】
3675: [Apio2014]序列分割 Time Limit: 40 Sec Memory Limit: 128 MB Submit: 3366 Solved: 1355 [Submit][St ...
- [Bzoj3675][Apio2014]序列分割(斜率优化)
3675: [Apio2014]序列分割 Time Limit: 40 Sec Memory Limit: 128 MBSubmit: 4021 Solved: 1569[Submit][Stat ...
- BZOJ3675 [Apio2014]序列分割 动态规划 斜率优化
原文链接http://www.cnblogs.com/zhouzhendong/p/8697258.html 题目传送门 - BZOJ3675 题意 对于一个非负整数序列,小H需要重复k次以下的步骤: ...
- 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 ...
- 2018.09.29 bzoj3675: [Apio2014]序列分割(斜率优化dp)
传送门 斜率优化dp经典题目. 首先需要证明只要选择的K个断点是相同的,那么得到的答案也是相同的. 根据分治的思想,我们只需要证明有两个断点时成立,就能推出K个断点时成立. 我们设两个断点分成的三段连 ...
- bzoj3675: [Apio2014]序列分割
留坑 为什么别人家的斜率优化跟我一点都不一样! 为什么斜率都要变成正的... 为什么要那么推式子 为什么不能直接做啊..... 为什么不把0去掉去秒WA啊 为什么叉积去了0也过不了啊 woc啊 #in ...
- [luogu3648][bzoj3675][APIO2014]序列分割【动态规划+斜率优化】
题目大意 让你把一个数列分成k+1个部分,使分成乘积分成各个段乘积和最大. 分析 首先肯定是无法开下n \(\times\) n的数组,那么来一个小技巧:因为我们知道k的状态肯定是从k-1的状态转移过 ...
- 【BZOJ-3675】序列分割 DP + 斜率优化
3675: [Apio2014]序列分割 Time Limit: 40 Sec Memory Limit: 128 MBSubmit: 1420 Solved: 583[Submit][Statu ...
随机推荐
- Eclipse web项目更改项目名称
1. 右键工程:Refactor->Rename,更改项目名称: 2. 修改项目目录下:.project文件 <?xml version="1.0" encoding= ...
- 正确配置 debian squeeze apt 源
本想在 Debian Squeeze 上安装一些依赖,没想到刚执行 apt-get update ,就出现这样的错误信息. W: GPG error: http://mirrors.163.com s ...
- Gitlab CI-3.遇到的问题
五.遇到的问题 1. cannot validate certificate for x.x.x.x because it doesn't contain any IP SANs 报错信息:ERROR ...
- sql语句(Mysql数据库)
Mysql数据库的sql语句: 一.基本操作 1.连接数据库 mysql -uroot -proot -hlocalhost -P3306 (-u表示用户名,-p密码,-h主机,-P端口号) 2.选择 ...
- Excel VBA宏 链接服务器 上传和下载数据
首先说明以下. 第一: 下面的 “ _" 也就是 空格下划线 在VBA中表示换行的意思:& 表示链接连个字符串的操作,注意 & 的前后是否需要空格 第二: 如果链接服务器,服 ...
- node child_process模块
NodeJs是一个单进程的语言,不能像Java那样可以创建多线程来并发执行.当然在大部分情况下,NodeJs是不需要并发执行的,因为它是事件驱动性永不阻塞.但单进程也有个问题就是不能充分利用CPU的多 ...
- Python3入门机器学习 - k近邻算法
邻近算法,或者说K最近邻(kNN,k-NearestNeighbor)分类算法是数据挖掘分类技术中最简单的方法之一.所谓K最近邻,就是k个最近的邻居的意思,说的是每个样本都可以用它最接近的k个邻居来代 ...
- 利用原生Javascript实现计算器(未完待续)
这里,将记录我升级四则运算v1.2的整个过程. 环境检测,杨说检测环境也是可以高兴到手舞足蹈的一件事. 为了实现自动化,Testing,查阅相关资料,我这里使用了node(这里为了npm).yoema ...
- Teamproject Week7 --Scrum Meeting #1 2014.10.28
这是团队的第一次会议,具体议题如下: 1)我们明确了团队成员的职责所需: PM职责:根据项目范围.质量.时间与成本的综合因素的考虑,进行项目的总体规划与阶段计划. 控制项目组各成员的工作进度,即时了 ...
- 面向对象OO第9-11次作业总结
面向对象OO第9-11次作业总结 1.关于规格化设计的调研程序规格说明:对程序所应满足的要求,以可验证的方式作出完全.精确陈述的文件.“规格说明”一词与其他工业产品的“规格说明书”有相似的含义.不过, ...