洛谷传送门

题目大意:让你把序列切割k次,每次切割你能获得 这一整块两侧数字和的乘积 的分数,求最大的分数并输出切割方案

神题= =

搞了半天也没有想到切割顺序竟然和答案无关...我太弱了

证明很简单,就是乘法分配律,把式子展开就行了

定义$s_{i}$为序列$a$的前缀和,定义$f[k][i]$表示第$k$次切割是在第$i$个位置的后面,$f[k][i]=max(f[k-1][j]+(s_{i}-s_{j})*(s_{n}-s_{i}))$

展开式子,移项,发现$x$递增,斜率$k$也递增,用队列维护上凸包就行了

至于记录方案,另开一个数组,记录从哪转移来的就行了

复杂度$O(nk)$

又没长记性把$i$打成$j$了(捂脸)

 #include <cmath>
#include <queue>
#include <vector>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define N1 101000
#define M1 205
#define ll long long
#define dd double
#define uint unsigned int
#define idx(X) (X-'0')
using namespace std; int gint()
{
ll ret=;int fh=;char c=getchar();
while(c<''||c>''){if(c=='-')fh=-;c=getchar();}
while(c>=''&&c<=''){ret=ret*+c-'';c=getchar();}
return ret*fh;
}
int n,K;
int a[N1];
ll sa[N1],f[][N1],x[N1],y[N1];
int fa[M1][N1];
int que[N1],ret[N1]; int main()
{
freopen("t2.in","r",stdin);
scanf("%d%d",&n,&K);
for(int i=;i<=n;i++)
a[i]=gint(),sa[i]=sa[i-]+a[i];
int now=,pst=;
for(int k=;k<=K;k++)
{
int hd=,tl=,j;
que[++tl]=;
for(int i=;i<n;i++)
{
while(hd+<=tl&&(y[que[hd+]]-y[que[hd]])>=-(x[que[hd+]]-x[que[hd]])*sa[i])
hd++;
j=que[hd];
f[now][i]=f[pst][j]+(sa[i]-sa[j])*(sa[n]-sa[i]);
fa[k][i]=j;
x[i]=sa[i],y[i]=f[pst][i]-sa[i]*sa[n];
while(hd+<=tl&&(y[i]-y[que[tl-]])*(x[que[tl]]-x[que[tl-]])>=(y[que[tl]]-y[que[tl-]])*(x[i]-x[que[tl-]]))
tl--;
que[++tl]=i;
}swap(now,pst);
}
ll ans=,id=;
for(int i=;i<n;i++)
if(f[pst][i]>ans)
ans=f[pst][i],id=i;
for(int k=K;k>=;k--)
ret[k]=id,id=fa[k][id];
printf("%lld\n",ans);
for(int k=;k<=K;k++)
printf("%d ",ret[k]);
puts("");
return ;
}

BZOJ 3675 [Apio2014]序列分割 (斜率优化DP)的更多相关文章

  1. BZOJ 3675 APIO2014 序列切割 斜率优化DP

    题意:链接 方法:斜率优化DP 解析:这题BZ的数据我也是跪了,特意去网上找到当年的数据后面二十个最大的点都过了.就是过不了BZ. 看到这道题自己第一发DP是这么推得: 设f[i][j]是第j次分第i ...

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

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

  3. [APIO2014]序列分割 --- 斜率优化DP

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

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

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

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

    WA了一版... 切点确定的话, 顺序是不会影响结果的..所以可以dp dp(i, k) = max(dp(j, k-1) + (sumn - sumi) * (sumi - sumj)) 然后斜率优 ...

  6. 【斜率DP】BZOJ 3675:[Apio2014]序列分割

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

  7. P3648 [APIO2014]序列分割 斜率优化

    题解:斜率优化\(DP\) 提交:\(2\)次(特意没开\(long\ long\),然后就死了) 题解: 好的先把自己的式子推了出来: 朴素: 定义\(f[i][j]\)表示前\(i\)个数进行\( ...

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

    题目链接 BZOJ 3675 首先最后的答案和分割的顺序是无关的, 那么就可以考虑DP了. 设$f[i][j]$为做了$i$次分割,考虑前$j$个数之后的最优答案. 那么$f[i][j] = max( ...

  9. bzoj 3675: [Apio2014]序列分割【斜率优化dp】

    首先看这个得分方式,容易发现就相当于分k段,每段的值和两两乘起来. 这样就很容易列出dp方程:设f[i][j]为到j分成分成i段,转移是 \[ f[i][j]=max { f[k][j]+s[k]*( ...

随机推荐

  1. Be born

    2018-07-22 16:22:03 Cherry is being greater and greater!

  2. 训练1-V

    输入2个正整数A,B,求A与B的最大公约数. Input 2个数A,B,中间用空格隔开.(1<= A,B <= 10^9) Output 输出A与B的最大公约数. Sample Input ...

  3. js区分ie不同版本

    方法1  js中 if(window.ActiveXObject)//判断浏览器是否属于IE { var browser=navigator.appName var b_version=navigat ...

  4. BA-闭式冷却塔系统

  5. Spring Boot 第一个demo

    Sring boot  一直没有使用过,跳槽来到新公司,暂时没有事情就学习一下. Spring boot  这里采用的是maven 来创建的 maven项目的pom.xml 文件 <?xml v ...

  6. python:单引号,双引号和三引号

    python中字符串可以用单引号括起来,也可以用双引号,这两种方式是等价的需要表示一个字符串对象的话,单引号和双引号没有区别 为什么需要单引号和双引号同时支持,而一般都是”呢? 比如” 双引号’里面有 ...

  7. NYOJ 298

    利用矩阵来做变换,参考Max大神的思想的,虽然不是同一道题. ----------- 给定n个点,m个操作,构造O(m+n)的算法输出m个操作后各点的位置.操作有平移.缩放.翻转和旋转    这里的操 ...

  8. HDU 4268 Alice and Bob(贪心+Multiset的应用)

     题意: Alice和Bob有n个长方形,有长度和宽度,一个矩形能够覆盖还有一个矩形的条件的是,本身长度大于等于还有一个矩形,且宽度大于等于还有一个矩形.矩形不可旋转.问你Alice最多能覆盖Bo ...

  9. 基于lucene的案例开发:纵横小说分布式採集

    转载请注明出处:http://blog.csdn.net/xiaojimanman/article/details/46812645 http://www.llwjy.com/blogdetail/9 ...

  10. Android 零基础学习之路

    第一阶段:Java面向对象编程 1.Java基本数据类型与表达式,分支循环. 2.String和StringBuffer的使用.正則表達式. 3.面向对象的抽象.封装,继承,多态.类与对象.对象初始化 ...