https://www.lydsy.com/JudgeOnline/problem.php?id=3675

https://www.luogu.org/problemnew/show/P3648

http://uoj.ac/problem/104

PS:题面与题解针对于洛谷与uoj版本,bzoj请自觉把“输出做法”删去。

小H最近迷上了一个分隔序列的游戏。在这个游戏里,小H需要将一个长度为n的非负整数序列分割成k+1个非空的子序列。为了得到k+1个子序列,小H需要重复k次以下的步骤:
1.小H首先选择一个长度超过1的序列(一开始小H只有一个长度为n的序列——也就是一开始得到的整个序列);
2.选择一个位置,并通过这个位置将这个序列分割成连续的两个非空的新序列。
每次进行上述步骤之后,小H将会得到一定的分数。这个分数为两个新序列中元素和的乘积。小H希望选择一种最佳的分割方式,使得k轮之后,小H的总得分最大。

参考:洛谷题解(虽然不算参考emmm只是斜率优化写跪了来debug用的)。

不难证出只要分割点固定那么答案固定,因此O(kn^2)不难想。

令s[i]表示前i项前缀和,那么我们有:

f[k][i]=max(f[k][i],f[k-1][j]+(s[i]-s[j])*s[j])

这个式子显然可以斜率优化,维护一个单调不增序列,令k<j<i。

忽略f的前一维,则当f[k]+(s[i]-s[k])*s[k]<=f[j]+(s[i]-s[j])*s[j],把k从队首弹出。

所以g[k,j]=(f[k]-f[j]+sqr(s[j])-sqr(s[k]))/(s[j]-s[k])<=s[i]时弹出k即可。

同时考虑g[k,j]>=g[j,i]时把j弹出,给出证明。

显然当g[j,i]<=s[i]时j不优。

当g[k,j]>=g[j,i]>s[i]时k比j优仍然把j弹出。

//我还naive的想要维护单调不减序列结果各种奇葩错误emmm……

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
typedef double dl;
const int N=1e5+;
const int K=;
inline int read(){
int X=,w=;char ch=;
while(!isdigit(ch)){w|=ch=='-';ch=getchar();}
while(isdigit(ch))X=(X<<)+(X<<)+(ch^),ch=getchar();
return w?-X:X;
}
ll f[][N];
int n,k,nxt[N][K],q[N],s[N],l,r,now=,pre=;
inline ll sqr(ll k){return k*k;}
inline dl suan(int j,int k){
if(s[j]==s[k])return -1e18;
int i=pre;
return (f[i][k]-f[i][j]+sqr(s[j])-sqr(s[k]))/(dl)(s[j]-s[k]);
}
int main(){
n=read(),k=read();
for(int i=;i<=n;i++)s[i]=s[i-]+read();
for(int j=;j<=k;j++){
now^=,pre^=;l=r=;
for(int i=;i<=n;i++){
while(l<r&&suan(q[l],q[l+])<=(dl)s[i])l++;
int t=q[l];
f[now][i]=f[pre][t]+(ll)(s[i]-s[t])*s[t];nxt[i][j]=t;
while(l<r&&suan(q[r-],q[r])>=suan(q[r],i))r--;
q[++r]=i;
}
}
printf("%lld\n",f[now][n]);
int tmp=nxt[n][k];
while(k){
printf("%d ",tmp);
tmp=nxt[tmp][--k];
}
return ;
}

+++++++++++++++++++++++++++++++++++++++++++

+本文作者:luyouqi233。               +

+欢迎访问我的博客:http://www.cnblogs.com/luyouqi233/+

+++++++++++++++++++++++++++++++++++++++++++

BZOJ3675 & 洛谷3648 & UOJ104:[Apio2014]序列分割——题解的更多相关文章

  1. 【洛谷3648】[APIO2014] 序列分割(斜率优化DP)

    点此看题面 大致题意: 你可以对一个序列进行\(k\)次分割,每次得分为两个块元素和的乘积,求总得分的最大值. 区间\(DPor\)斜率优化\(DP\) 这题目第一眼看上去感觉很明显是区间\(DP\) ...

  2. 【洛谷 P3648】 [APIO2014]序列分割 (斜率优化)

    题目链接 假设有\(3\)段\(a,b,c\) 先切\(ab\)和先切\(bc\)的价值分别为 \(a(b+c)+bc=ab+bc+ac\) \((a+b)c+ab=ab+bc+ac\) 归纳一下可以 ...

  3. 【洛谷3648/BZOJ3675】[APIO2014]序列分割(斜率优化DP)

    题目: 洛谷3648 注:这道题洛谷3648有SPJ,要求输出方案.BZOJ3675数据组数较多但不要求输出方案. 分析: 这可能是我第三次重学斜率优化了--好菜啊 这道题首先一看就是个DP.稍微推一 ...

  4. 洛谷 P3648 [APIO2014]序列分割 解题报告

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

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. iOS 测试工具reveal可视化调试工具的使用

    简单翻译一下reveal可视化图形工具插入项目的官方文档(官方英文版file:///Applications/Reveal.app/Contents/SharedSupport/Documentati ...

  2. Prism MEF example

    Related Attributes These attributes are under namespace System.ComponentModel.Composition Import The ...

  3. 「专题训练」Boredom(CodeForces Round #260 Div.1 A)

    题意(Codeforces-455A) 给你\(n\)个数,你每次可以选择删除去一个数\(x\)获得\(x\)分,但是所有为\(x+1\)和\(x-1\)的数都得删去.问最大获得分数. 分析 这是一条 ...

  4. hdu2544最短路(floyd基础)

    最短路 Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...

  5. Linux命令应用大词典-第34章 打印与传真

    34.1 lpr:打印文件 34.2 lpq:显示打印队列状态 34.3 lprm:取消打印作业 34.4 lpstat:显示cups状态信息 34.5 cupsaccept:接受作业发送到目的地 3 ...

  6. 那些年我们不爱学的mysql单词

    MySQL 一种关系型数据库 database 数据库,简称DB databases 数据库的复数,代表多个数据库 net 网络/服务 start 启动 stop 停止 root MySQL数据库中的 ...

  7. jQuery筛选器及对DOM修改(学习笔记)

    1.jQuery筛选器 注意:请先在管理Nuget程序包中查找jQuery包,并安装.也可以在jQuery官网下载. 实现: <!DOCTYPE html> <html xmlns= ...

  8. 使用getid3获取音频文件信息

    今天有个需求,在上传音频文件时候自动获取音频的秒数,和大家分享一下. 首先把getid3的包下载下来 链接:https://pan.baidu.com/s/1Qmdj-I4boz9Sm9GFsON0D ...

  9. 创建一个socket服务实时统计在线人数

    主要是两个文件,一个是后端文件,一个是前端文件: 后端文件:有人登录了,就通知所有的正在访问的页面,把总人数+1:反之-1: 前端文件:有人登录了,通知后端,页面关闭了,通知后端,同时接收后端派发来的 ...

  10. lintcode39 恢复旋转排序数组

    恢复旋转排序数组   给定一个旋转排序数组,在原地恢复其排序. 您在真实的面试中是否遇到过这个题? Yes 说明 什么是旋转数组? 比如,原始数组为[1,2,3,4], 则其旋转数组可以是[1,2,3 ...