【BZOJ 3675】[Apio2014]序列分割
【链接】 链接
【题意】
在这里输入题意
【题解】
模拟一下样例。
会发现。切的顺序不影响最后的答案。
只要切点确定了。
答案就确定了。
则设f[i][j]表示前i段,第i段保留到j的最大值。
$f[i][j] = max(f[i-1][x] + (s[j]-s[x])*(s[n]-s[j]))$
$s[i] = a[1] + a[2] +...+a[i]$
然后还是考虑x s[n]-s[j]$
而s[n]-s[j]是单调递减的;
这就能加一个斜率优化了。
注意这里是>s[n]-s[j]才y更优。
则队列的出入队和经典的斜率优化条件相反。
最后输出f[k+1][n]就好;
要用滚动数组。不然会MLE.
【错的次数】
在这里输入错的次数
【反思】
在这里输入反思
【代码】
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int N = 1e5,K = 200;
int n,k,h,t,dl[N+10];
ll a[N+10],f[2][N+10],s[N+10];
double ju(int i,int x,int y)
{
double fenzi = f[(i-1)&1][y] - f[(i-1)&1][x];
double fenmu = s[y] - s[x];
if (s[y]==s[x]) return 2e9;
return fenzi/fenmu;
}
int main()
{
//freopen("F:\\rush.txt","r",stdin);
scanf("%d%d",&n,&k);
for (int i = 1;i <= n;i++) scanf("%lld",&a[i]);
for (int i = 1;i <= n;i++) s[i] = s[i-1] + a[i];
for (int i = 1;i <= k + 1;i++)
{
memset(f[i&1],0,sizeof f[i&1]);
h = t = 1;
dl[1] = 0;
for (int j = 1;j <= n;j++)
{
while (h < t && ju(i,dl[h],dl[h+1]) > s[n]-s[j]) h++;
int x = dl[h];
f[i&1][j] = max(f[i&1][j],f[(i-1)&1][x] + (s[j]-s[x])*(s[n]-s[j]));
while (h < t && ju(i,dl[t-1],dl[t]) < ju(i,dl[t],j)) t--;
dl[++t] = j;
}
}
printf("%lld\n",f[(k+1)&1][n]);
return 0;
}
【BZOJ 3675】[Apio2014]序列分割的更多相关文章
- 【斜率DP】BZOJ 3675:[Apio2014]序列分割
3675: [Apio2014]序列分割 Time Limit: 40 Sec Memory Limit: 128 MBSubmit: 1066 Solved: 427[Submit][Statu ...
- BZOJ 3675: [Apio2014]序列分割( dp + 斜率优化 )
WA了一版... 切点确定的话, 顺序是不会影响结果的..所以可以dp dp(i, k) = max(dp(j, k-1) + (sumn - sumi) * (sumi - sumj)) 然后斜率优 ...
- bzoj 3675 [Apio2014]序列分割(斜率DP)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3675 [题意] 将n个数的序列分割k次,每次的利益为分割后两部分数值和的积,求最大利益 ...
- BZOJ 3675 [Apio2014]序列分割 (斜率优化DP)
题目链接 BZOJ 3675 首先最后的答案和分割的顺序是无关的, 那么就可以考虑DP了. 设$f[i][j]$为做了$i$次分割,考虑前$j$个数之后的最优答案. 那么$f[i][j] = max( ...
- 动态规划(斜率优化):BZOJ 3675 [Apio2014]序列分割
Description 小H最近迷上了一个分割序列的游戏.在这个游戏里,小H需要将一个长度为N的非负整数序列分割成k+l个非空的子序列.为了得到k+l个子序列, 小H将重复进行七次以下的步骤: 1.小 ...
- bzoj 3675: [Apio2014]序列分割
Description 小H最近迷上了一个分隔序列的游戏.在这个游戏里,小H需要将一个长度为n的非负整数序列分割成k+1个非空的子序列.为了得到k+1个子序列,小H需要重复k次以下的步骤: 1.小H首 ...
- BZOJ 3675 [Apio2014]序列分割 (斜率优化DP)
洛谷传送门 题目大意:让你把序列切割k次,每次切割你能获得 这一整块两侧数字和的乘积 的分数,求最大的分数并输出切割方案 神题= = 搞了半天也没有想到切割顺序竟然和答案无关...我太弱了 证明很简单 ...
- bzoj 3675: [Apio2014]序列分割【斜率优化dp】
首先看这个得分方式,容易发现就相当于分k段,每段的值和两两乘起来. 这样就很容易列出dp方程:设f[i][j]为到j分成分成i段,转移是 \[ f[i][j]=max { f[k][j]+s[k]*( ...
- BZOJ 3675: [Apio2014]序列分割 动态规划 + 斜率优化 + 卡精度
Code: #include<bits/stdc++.h> #define N 100006 #define M 205 #define ll long long #define setI ...
- 3675: [Apio2014]序列分割
Description 小H最近迷上了一个分隔序列的游戏.在这个游戏里,小H需要将一个长度为n的非负整数序列分割成k+1个非空的子序列.为了得到k+1个子序列,小H需要重复k次以下的步骤: 1.小H首 ...
随机推荐
- vim-大小写装换
以下内容参考自 http://blog.csdn.net/yangzhongxuan/article/details/8484167 自己验证了效果 命令一:单个字符转换(光标所在位置的字母进行转换) ...
- Android学习笔记技巧之给文本加边框
BorderTextViews.Java package xiaosi.BorderTextView; import android.content.Context; import android.g ...
- python学习三:列表,元组
1.列表: 1.列表的定义方式: list1 = [1,2,3,4,"hello","world"] 如上所示,list1就是一个列表,列表的内容以中括号包含起 ...
- windows防火墙开放zabbix端口(批处理)
windows系统在防火墙开启的情况下,打开zabbix端口(10050与10051) 可以手动添加规则,也可以使用批处理生成. 一.下面先介绍批处理 netsh advfirewall firewa ...
- CODEVS——T1979 第K个数
http://codevs.cn/problem/1979/ 时间限制: 1 s 空间限制: 1000 KB 题目等级 : 黄金 Gold 题解 查看运行结果 题目描述 Descript ...
- android.mk-编译文件学习(转载)
工作了那么久,都是使用大神们写的脚本机械的编译,对于android.mk根本没去了解过.今天趁着这个机会,在网上搜索了下.虽然依然不是很名白,留做记录,以后真用到了,再深入研究 转载自 http:// ...
- Core Animation 文档翻译—附录A(Layer样貌相关属性动画)
前言 在渲染过程中,核心动画获取Layer的各种属性并以特定的顺序渲染他们.这个顺序决定了Layer的最终的样貌.本节将会阐述通过设置不同的Layer样貌相关属性对应产生的渲染结果. 注意:Mac ...
- 1.namesapce用法
namespace用法示例 #include <iostream> using namespace std; //定义域名空间 namespace myspace { ; void sho ...
- Redis原理(一)
基础和应用 1.Redis是远程调用技术的首字母缩写. 2.Redis可以用来做什么? Redis可以用来做缓存. 分布式锁 3.Redis的应用举例 记录帖子的点赞数.评论数和点击数.(使用HASH ...
- jquery中empty()和remove()的区别
empty 顾名思义,清空方法,但是与删除又有点不一样,因为它只移除了 指定元素中的所有子节点. remove与empty一样,都是移除元素的方法,但是remove会将元素自身移除,同时也会移除元素内 ...