[APIO2014]序列分割
link
试题分析
其实可以发现我们选择切的顺序可以颠换。
所以我们可以设$dp(i,j)$表示为前$i$个共切$j$的最大得分,然后$dp(i,j)=max(dp(i-1,z)+s[z] \times (s[i]-s[z])),s[i]=\sum_{i=1}^i a_i$。
然后发现这是个斜率优化的式子,但是斜率只有一项,且为-$dp(i,j)$,所以我们虽然是要去维护上凸壳但其实事实上维护下凸壳。然后就基本斜率优化操作了。
#include<iostream> #include<cstring> #include<cstdio> #include<algorithm> #define int long long using namespace std; inline int read(){int f=1,ans=0;char c=getchar();while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}while(c>='0'&&c<='9'){ans=ans*10+c-'0';c=getchar();}return f*ans; } const int N=100011; const int K=211; int f[K][N],n,k,s[N],last[K][N],que[N],dp[N],g[N],X[N],Y[N]; signed main(){ // freopen("10.in","r",stdin);n=read(),k=read();for(int i=1;i<=n;i++) s[i]=s[i-1]+read();for(int p=1;p<=k;p++){int l,r;l=r=1;que[1]=0;for(int i=1;i<=n;i++) g[i]=f[p-1][i];Y[0]=s[0]*s[0]-g[0],X[0]=s[0];for(int i=1;i<=n;i++){while(l<r&&(Y[que[l+1]]-Y[que[l]])<=s[i]*(X[que[l+1]]-X[que[l]])) l++;f[p][i]=f[p-1][que[l]]+s[que[l]]*(s[i]-s[que[l]]);last[p][i]=que[l];X[i]=s[i],Y[i]=s[i]*s[i]-g[i];while(l<r&&(Y[que[r]]-Y[que[r-1]])*(X[i]-X[que[r]])>=(Y[i]-Y[que[r]])*(X[que[r]]-X[que[r-1]])) r--;que[++r]=i;}}int r=n;printf("%lld\n",f[k][n]); for(int i=k;i>=1;i--){printf("%d ",last[i][r]);r=last[i][r];} }
View Code
转载于:https://www.cnblogs.com/si-rui-yang/p/10121667.html
[APIO2014]序列分割相关推荐
- BZOJ3675: [Apio2014]序列分割
BZOJ3675: [Apio2014]序列分割 Description 小H最近迷上了一个分隔序列的游戏. 在这个游戏里,小H需要将一个长度为n的非负整数序列分割成k+1个非空的子序列. 为了得到k ...
- BZOJ3675 [APIO2014]序列分割
Description 小H最近迷上了一个分隔序列的游戏.在这个游戏里,小H需要将一个长度为n的非负整数序列分割成k+1个非空的子序列.为了得到k+1个子序列,小H需要重复k次以下的步骤: 1.小H首 ...
- 动态规划(斜率优化):BZOJ 3675 [Apio2014]序列分割
Description 小H最近迷上了一个分割序列的游戏.在这个游戏里,小H需要将一个长度为N的非负整数序列分割成k+l个非空的子序列.为了得到k+l个子序列, 小H将重复进行七次以下的步骤: 1.小 ...
- 【洛谷3648】[APIO2014] 序列分割(斜率优化DP)
点此看题面 大致题意: 你可以对一个序列进行\(k\)次分割,每次得分为两个块元素和的乘积,求总得分的最大值. 区间\(DPor\)斜率优化\(DP\) 这题目第一眼看上去感觉很明显是区间\(DP\) ...
- [APIO2014] 序列分割(斜率优化dp)
problem luogu-P3648 你正在玩一个关于长度为 nnn 的非负整数序列的游戏.这个游戏中你需要把序列分成 k+1k+1k+1 个非空的块. 为了得到 k+1k+1k+1 块,你需要重复 ...
- 洛谷P3648 [APIO2014]序列分割(斜率优化)
传送门 没想到这种多个状态转移的还能用上斜率优化--学到了-- 首先我们可以发现,切的顺序对最终答案是没有影响的 比方说有一个序列$abc$,每一个字母都代表几个数字,那么先切$ab$再切$bc$,得 ...
- bzoj 3675: [Apio2014]序列分割
(一开始决策单调性证错了..(蛋疼)(其实是没有单调性的,怎么都一样),可以自己写一写i<j,先分i后分j,和先分j后分i是一样的) (而且犇蒟蒻发现斜率优化随便推上一个式子就可以了,(感觉比D ...
- 【BZOJ3675】【Apio2014】序列分割
Description 传送门 Solution 之前我也遇到过一次这种"两段之和乘积作为贡献"的问题:考虑把这一种\((\sum) *(\sum)\)的形式拆括号,就可以发现 ...
- (APIO2014)序列分割
题解: 我也不知道为啥上午上课讲了我昨天看的3题 这题关键在于发现操作顺序无关的 可以发现最终答案是任意两段乘积的和 那这个东西显然是可以dp的 然后可以斜率优化一波 nklongn 另外上课讲的是当 ...
- P3648-[APIO2014]序列分割【斜率优化】
正题 题目链接:https://www.luogu.com.cn/problem/P3648 题目大意 nnn个数字的序列,分割kkk次,每次的权值是左右两块数字的乘积.求最大权值和分割方案. 解题思 ...
最新文章
- js如何生成[n,m]的随机数
- 51单片机中将变量、数组、函数设置在固定位置,定位到绝对地址
- Promise和setTimeout执行顺序 面试题
- C#请求Post接口
- pytorch教程龙曲良01-05
- SpringCloud Nacos + Ribbon 调用服务的 2 种方法!
- JAVA编写的火车票售票系统
- Boot Hill 布特山
- linux 硬盘报警声
- 利用ffmpeg解析视频文件信息
- efm32芯片电压_Silicon Labs超低功耗32位 MCU EFM32HG系列成功应用在大华股份无线烟感...
- java 怎么做批量修改_JAVA实现批量修改文件名称
- 金 融 量 化 分 析 • JoinQuant • 第 七 篇
- 2019的百度网盘下载速度太慢老是限速怎么解决?
- 使用Linux命令cURL实现文件定时上传到ftp服务器的程序
- 深信服校园招聘c/c++ 软件开发A卷--菜鸡落泪
- java 语法错误_java菜鸟提问:编译时异常和语法错误的区别?
- SpringSecurity最新版本使用总结
- airbnb_Airbnb对观众情感联系的误解导致双重抵制
- 【各种装系统方法的差别以及性能】
热门文章
- ET vs Ad hoc
- SQLite3-轻量级数据库
- 密码保险箱 TBox
- ssl证书下载与安装 – 如何下载ssl证书
- Msm8960(APQ8064)平台的MSM-AOSP-kitkat编译适配(2):开发环境及相关的使用技巧
- 【君思智慧园区】物业管理系统解决方案
- psp模拟器完美字库_透过模拟器看见那个疯狂的学习机年代(模拟器篇)(待续)...
- 液晶拼接处理器_大屏幕显示系统设备中矩阵与液晶拼接屏的连接方法
- 2022年R2移动式压力容器充装操作证考试题库及答案
- 基于SSM的图书商城的设计与实现(文末附源码)