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\)段的贡献最大值:

\[f_{i,j}=\max\{f_{k,j-1}+(s_i-s_k)s_k\}\;\;(k<i)
\]

   

  

  直接DP是\(\mathcal O((k+1)n^2)\)的。而看到这个式子比较简单,考虑斜率优化。这里省去第二维,整体做\(k+1\)次即可。

  

​  设\(k<j<i\),\(j\)比\(k\)优,则有:

\[\begin{aligned}
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】序列分割的更多相关文章

  1. bzoj3675[Apio2014]序列分割 斜率优化dp

    3675: [Apio2014]序列分割 Time Limit: 40 Sec  Memory Limit: 128 MBSubmit: 3508  Solved: 1402[Submit][Stat ...

  2. BZOJ3675 [Apio2014]序列分割 【斜率优化dp】

    3675: [Apio2014]序列分割 Time Limit: 40 Sec  Memory Limit: 128 MB Submit: 3366  Solved: 1355 [Submit][St ...

  3. [Bzoj3675][Apio2014]序列分割(斜率优化)

    3675: [Apio2014]序列分割 Time Limit: 40 Sec  Memory Limit: 128 MBSubmit: 4021  Solved: 1569[Submit][Stat ...

  4. BZOJ3675 [Apio2014]序列分割 动态规划 斜率优化

    原文链接http://www.cnblogs.com/zhouzhendong/p/8697258.html 题目传送门 - BZOJ3675 题意 对于一个非负整数序列,小H需要重复k次以下的步骤: ...

  5. BZOJ3675 Apio2014 序列分割 【斜率优化】

    Description 小H最近迷上了一个分隔序列的游戏.在这个游戏里,小H需要将一个长度为n的非负整数序列分割成k+1个非空的子序列.为了得到k+1个子序列,小H需要重复k次以下的步骤: 1.小H首 ...

  6. BZOJ3675: [Apio2014]序列分割(斜率优化)

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

  7. 2018.09.29 bzoj3675: [Apio2014]序列分割(斜率优化dp)

    传送门 斜率优化dp经典题目. 首先需要证明只要选择的K个断点是相同的,那么得到的答案也是相同的. 根据分治的思想,我们只需要证明有两个断点时成立,就能推出K个断点时成立. 我们设两个断点分成的三段连 ...

  8. bzoj3675: [Apio2014]序列分割

    留坑 为什么别人家的斜率优化跟我一点都不一样! 为什么斜率都要变成正的... 为什么要那么推式子 为什么不能直接做啊..... 为什么不把0去掉去秒WA啊 为什么叉积去了0也过不了啊 woc啊 #in ...

  9. [luogu3648][bzoj3675][APIO2014]序列分割【动态规划+斜率优化】

    题目大意 让你把一个数列分成k+1个部分,使分成乘积分成各个段乘积和最大. 分析 首先肯定是无法开下n \(\times\) n的数组,那么来一个小技巧:因为我们知道k的状态肯定是从k-1的状态转移过 ...

  10. 【BZOJ-3675】序列分割 DP + 斜率优化

    3675: [Apio2014]序列分割 Time Limit: 40 Sec  Memory Limit: 128 MBSubmit: 1420  Solved: 583[Submit][Statu ...

随机推荐

  1. SICP读书笔记 3.3

    SICP CONCLUSION 让我们举起杯,祝福那些将他们的思想镶嵌在重重括号之间的Lisp程序员 ! 祝我能够突破层层代码,找到住在里计算机的神灵! 目录 1. 构造过程抽象 2. 构造数据抽象 ...

  2. 最优方向法(MOD)

    算法描述 求解模型: \[\min\sum\limits_i\|x_i\|_0 \quad \mathrm{s.t.} \; \|Y-DX\|^2_F \leq \varepsilon\] 或 \[\ ...

  3. Windows下的ROUGE文本测评工具基本安装

    需要的安装包: rouge1.5.5:https://pan.baidu.com/s/1B7-LYn1lZKC8f51yXxNK9w Strawberry Perl :http://strawberr ...

  4. codeforces 1133E K Balanced Teams

    题目链接:http://codeforces.com/contest/1133/problem/E 题目大意: 在n个人中找到k个队伍.每个队伍必须满足最大值减最小值不超过5.求满足条件k个队伍人数的 ...

  5. getField()与getDeclaredField()的区别

    Java的反射机制中,用Class的getField(String name)或getDelaredField(String name)可以得到目标类的指定属性,返回类型是Field. 但这两个是有区 ...

  6. 随手记录-linux-Linux目录结构

    转:别人的 装完Linux,首先需要弄清Linux 标准目录结构 / root —?启动Linux时使用的一些核心文件.如操作系统内核.引导程序Grub等. home —?存储普通用户的个人文件 ft ...

  7. 第28次Scrum会议(11/16)【欢迎来怼】

    一.小组信息 队名:欢迎来怼小组成员队长:田继平成员:李圆圆,葛美义,王伟东,姜珊,邵朔,阚博文小组照片 二.开会信息 时间:2017/11/16 17:20~17:42,总计22min.地点:东北师 ...

  8. Scrum Meeting 11.03

    成员 今日任务 明日计划 用时 徐越 休息     赵庶宏 编写功能说明书,servlet代码移植 servlet代码移植 3h 薄霖 阅读上一届相关代码,思考改进方法 学习安卓界面设计数据库管理 4 ...

  9. 校友聊---Sprint计划会议总结

    1.产品需求及索引卡: 校友聊的软件我们计划分三步进行设计实现功能:文字聊天.语音聊天.视频聊天.首先第一步我们要实现文字聊天这个功能. 经过调研讨论之后,确定了产品的几个需求:在局域网内实现通信要依 ...

  10. Task 8 找水王

    任务: 三人行设计了一个灌水论坛.信息学院的学生都喜欢在上面交流灌水,传说在论坛上有一个“水王”,他不但喜欢发帖,还会回复其他ID发的每个帖子.坊间风闻该“水王”发帖数目超过了帖子数目的一半. 如果你 ...