[luogu3648][bzoj3675][APIO2014]序列分割【动态规划+斜率优化】
题目大意
让你把一个数列分成k+1个部分,使分成乘积分成各个段乘积和最大。
分析
首先肯定是无法开下n \(\times\) n的数组,那么来一个小技巧:因为我们知道k的状态肯定是从k-1的状态转移过来的,而且只从k-1的状态转移过来,那么我们就记录一下k-1和k的状态。
然后我们再来动态规划:
状态肯定是:\(f[i]\)表示前i个数,分成j段(j枚举,滚动数组优化成n)。
转移方程就是:
\[f[i]=max(g[j]+sum[j]\times(sum[i]-sum[k]))\]
一开始看错题目了,以为是乘积的乘积最大,而且是各个段的。一直过不了样例。
那么以上的转移方程就可以拿到一小部分分数了。
以下是斜率优化的部分:
按照斜率优化的套路,首先假设j>k,且j的状态比k要优。
那么得到了式子:
\[g[j]+sum[j]\times(sum[i]-sum[j])>g[k]+sum[k]\times(sum[i]-sum[k])\]
化简就得到了以下的不等式:(初中知识就可以了)
\[\frac{(g[j]-sum[j]^2)-(g[k]-sum[k]^2)}{sum[k]-sum[j]}<=sum[i]\]
那么单调队列维护凸包就可以了。
开了o2卡了常才过掉的垃圾代码
// luogu-judger-enable-o2
#include <bits/stdc++.h>
#define N 100005
#define ll long long
#define db double
using namespace std;
ll g[N][255], f[N], dp[N], sum[N], a[N];
int n, m;
int q[N], ans[N];
template <typename T>
inline void read(T &x) {
x = 0; T fl = 1;
char ch = 0;
while (ch < '0' || ch > '9') {
if (ch == '-') fl = -1;
ch = getchar();
}
while (ch >= '0' && ch <= '9') {
x = (x << 1) + (x << 3) + (ch ^ 48);
ch = getchar();
}
x *= fl;
}
ll X(int i) {
return sum[i];
}
ll Y(int i) {
return f[i] - sum[i] * sum[i];
}
db slope(int i, int j) {
if (sum[i] == sum[j]) return - 1e18;
return ((1.0 * (Y(i) - Y(j))) / (1.0 * (X(j) - X(i))));
}
int main() {
read(n); read(m);
for (int i = 1; i <= n; i ++) {
read(a[i]);
sum[i] = sum[i - 1] + a[i];
}
for (int j = 1; j <= m; j ++) {
int h = 0, t = 0;
for (int i = 1; i <= n; i ++) {
while (h < t && slope(q[h], q[h + 1]) <= sum[i]) ++ h;
int k = q[h];
dp[i] = f[k] + sum[k] * (sum[i] - sum[k]);
g[i][j] = k;
while (h < t && slope(q[t - 1], q[t]) >= slope(q[t], i)) -- t;
q[++ t] = i;
}
for (int i = 1; i <= n; i ++) f[i] = dp[i];
}
printf("%lld\n", dp[n]);
int tot = 0;
for (int x = n, i = m; i >= 1; i --) {
x = g[x][i];
ans[++ tot] = x;
}
for (int i = tot; i >= 1; i --) printf("%d ", ans[i]);
return 0;
}
[luogu3648][bzoj3675][APIO2014]序列分割【动态规划+斜率优化】的更多相关文章
- BZOJ3675 [Apio2014]序列分割 动态规划 斜率优化
原文链接http://www.cnblogs.com/zhouzhendong/p/8697258.html 题目传送门 - BZOJ3675 题意 对于一个非负整数序列,小H需要重复k次以下的步骤: ...
- [Bzoj3675][Apio2014]序列分割(斜率优化)
3675: [Apio2014]序列分割 Time Limit: 40 Sec Memory Limit: 128 MBSubmit: 4021 Solved: 1569[Submit][Stat ...
- BZOJ3675 [Apio2014]序列分割 【斜率优化dp】
3675: [Apio2014]序列分割 Time Limit: 40 Sec Memory Limit: 128 MB Submit: 3366 Solved: 1355 [Submit][St ...
- 2018.09.29 bzoj3675: [Apio2014]序列分割(斜率优化dp)
传送门 斜率优化dp经典题目. 首先需要证明只要选择的K个断点是相同的,那么得到的答案也是相同的. 根据分治的思想,我们只需要证明有两个断点时成立,就能推出K个断点时成立. 我们设两个断点分成的三段连 ...
- BZOJ3675 Apio2014 序列分割 【斜率优化】
Description 小H最近迷上了一个分隔序列的游戏.在这个游戏里,小H需要将一个长度为n的非负整数序列分割成k+1个非空的子序列.为了得到k+1个子序列,小H需要重复k次以下的步骤: 1.小H首 ...
- BZOJ 3675: [Apio2014]序列分割 动态规划 + 斜率优化 + 卡精度
Code: #include<bits/stdc++.h> #define N 100006 #define M 205 #define ll long long #define setI ...
- 【BZOJ3675】序列分割(斜率优化,动态规划)
[BZOJ3675]序列分割(斜率优化,动态规划) 题面 Description 小H最近迷上了一个分隔序列的游戏.在这个游戏里,小H需要将一个长度为n的非负整数序列分割成k+1个非空的子序列.为了得 ...
- BZOJ_3675_[Apio2014]序列分割_斜率优化
BZOJ_3675_[Apio2014]序列分割_斜率优化 Description 小H最近迷上了一个分隔序列的游戏.在这个游戏里,小H需要将一个长度为n的非负整数序列分割成k+1个非空的子序列.为了 ...
- 【BZOJ-3675】序列分割 DP + 斜率优化
3675: [Apio2014]序列分割 Time Limit: 40 Sec Memory Limit: 128 MBSubmit: 1420 Solved: 583[Submit][Statu ...
- BZOJ 3675: [Apio2014]序列分割( dp + 斜率优化 )
WA了一版... 切点确定的话, 顺序是不会影响结果的..所以可以dp dp(i, k) = max(dp(j, k-1) + (sumn - sumi) * (sumi - sumj)) 然后斜率优 ...
随机推荐
- 项目笔记-SC01
项目启动已有两周,从分析需求到系统设计,文档性工作比较多,只是文档参考比较少,相对的标准就不好界定了. 计划开发时间理论上是按部就班的,没什么变化,可能真正进入开发阶段才会遇到一些问题吧,有些问题就是 ...
- net平台下c#操作ElasticSearch详解
net平台下c#操作ElasticSearch详解 ElasticSearch系列学习 ElasticSearch第一步-环境配置 ElasticSearch第二步-CRUD之Sense Elasti ...
- MYSQL 表大小限制
MySQL 3.22限制的表大小为4GB.由于在MySQL 3.23中使用了MyISAM存储引擎,最大表尺寸增加到了65536TB(2567 – 1字节).由于允许的表尺寸更大,MySQL数据库的最大 ...
- vue cli3 vue.config.js 配置详情
module.exports = { // 基本路径 baseUrl: process.env.NODE_ENV === 'production' ? '/' : '/', ...
- restful 规范(建议)
需求:开发cmdb,对用户进行管理. 做前后端分离,后端写api(URL),对用户表进行增删改查,应该写四个URL(还要给文档(返回值,返回,请求成功,干嘛,失败,干嘛)),然后分别写视图函数. ht ...
- python之路--初识函数
一 . 函数 什么是函数 f(x) = x + 1 y = x + 1 # 函数是对功能或者动作的封装 函数的语法 def 函数名(): 函数体 调用: 函数名() def play(): print ...
- centos7根分区扩容(亲测有效)
root@haojftest:~# df -h 文件系统 容量 已用 可用 已用% 挂载点 /dev/mapper/centos_test2-root 28G 14G 15G % / devtmpfs ...
- vue ajax
局部get: this.$http.get(url,{param:jsonData}).then(successCallback,failCallBack) 局部post: this.$http.po ...
- solr安装配置(一)
本文使用的solr版本是solr-5.5.5. 步骤: 1.解压solr压缩包. 2.将solr-5.5.5\server\solr-webapp目录下面的文件拷贝到Tomcat的webapps目录下 ...
- Lodop中特殊符号¥打印设计和预览不同
Lodop中¥符号样式改变问题 Lodop中对超文本样式的解析,虽然说是按照调用的本机ie引擎,但是调用的ie版本可能不同,导致在ie下是一种样式,预览又是另一种样式.可能是有些样式没有具体设置,走的 ...