博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
BZOJ3675 & 洛谷3648 & UOJ104:[Apio2014]序列分割——题解
阅读量:6531 次
发布时间:2019-06-24

本文共 1988 字,大约阅读时间需要 6 分钟。

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
#include
#include
#include
using namespace std;typedef long long ll;typedef double dl;const int N=1e5+5;const int K=205;inline int read(){ int X=0,w=0;char ch=0; while(!isdigit(ch)){w|=ch=='-';ch=getchar();} while(isdigit(ch))X=(X<<3)+(X<<1)+(ch^48),ch=getchar(); return w?-X:X;}ll f[2][N];int n,k,nxt[N][K],q[N],s[N],l,r,now=1,pre=0;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=1;i<=n;i++)s[i]=s[i-1]+read(); for(int j=1;j<=k;j++){ now^=1,pre^=1;l=r=0; for(int i=1;i<=n;i++){ while(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
=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 0;}

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

+本文作者:luyouqi233。               +

+欢迎访问我的博客:+

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

转载于:https://www.cnblogs.com/luyouqi233/p/8893754.html

你可能感兴趣的文章
估计下星期就能考科目二了
查看>>
轻松实现localStorage本地存储和本地数组存储
查看>>
mongodb group
查看>>
python+selenium自动化测试(二)
查看>>
(笔记 - 纯手敲)Spring的IOC和AOP 含GIT地址
查看>>
7-设计模式介绍
查看>>
让运维更高效:关于ECS系统事件
查看>>
J2EE分布式框架--单点登录集成方案
查看>>
跨域传递参数
查看>>
android 4.2的新特性layoutRtl,让布局自动从右往左显示
查看>>
iOS tableView 下拉列表的设计
查看>>
sharepoint 2010 属性编辑工具 SPCamlEditor 1.5.1
查看>>
linux下配置网络环境
查看>>
java Windows7 下环境变量设置
查看>>
NBU异构还原Oracle完整备份的一些总结
查看>>
freeBSD安装详细讲解
查看>>
WSFC2016 VM弹性与存储容错
查看>>
文档管理,文本编辑控件TX Text Control .NET for WPF
查看>>
复习 Python 匿名函数 内建函数
查看>>
Security Identifiers | Win SRV2016 SID Change 修改
查看>>