【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 ...
随机推荐
- Shuffle Bags让你的随机不那么随机
前言 当我最初写游戏时,我经常使用标准Random()函数,然后写一堆if和else条件来我获得预期结果.如果结果不太好,我会写更多的条件进行过滤或者筛选,直到我觉得游戏变得有趣.最近我发现有更好的方 ...
- react-native 常规操作
1. 关闭xcode打开模拟器的快捷键 , 等常规操作 https://www.jianshu.com/p/f6723f3406b7
- max number of clients reached Redis测试环境报错
现象:测试服务是去redis循环取数据,早上发现服务挂了,手动登陆redis 无法输入命令,报错:max number of clients reached Redis
- Hibernate的使用技巧②
1.Hibernate统计记录的数量 Criteria c = session.createCriteria(User.class.getName()); c.setProjection ...
- ubuntu16.04安装cuda8.0试错锦集
ubuntu16.04安装cuda8.0试错锦集 参考文献: [http://www.jianshu.com/p/35c7fde85968] [http://blog.csdn.net/sinat_1 ...
- Hibernate 延迟加载 分析
出处:http://www.ibm.com/developerworks/cn/java/j-lo-hibernatelazy/#icomments Hibernate 的延迟加载(lazy load ...
- ThinkPhp输入参数过滤
I('id',0); // 获取id参数 自动判断get或者post,不存在时返回默认值0 I('post.name','','htmlspecialchars'); //获取$_POST['name ...
- 关于.net服务启动注册到zookeeper,但是注册节点20分钟自动消失解决办法
ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,作用简单描述就是相当于一个中介,服务提供者将服务注册到zk,服务调用者直接从zk获取,zk的作用就是协调 最近碰到公 ...
- Ubuntu下面 PHPSTORM2017.2破解方法
Ubuntu下面 PHPSTORM2017.2破解方法 下载破解文件 在 http://idea.lanyus.com/上面新下载一个破解文件. 破解步骤 将JetbrainsCrack-2.6.3_ ...
- linux 无交互生成ssh rsa免秘证书
[root@xxx tmp]# man ssh-keygen NAME ssh-keygen - authentication key generation, management and conve ...