题意:链接

方法:斜率优化DP

解析:这题BZ的数据我也是跪了,特意去网上找到当年的数据后面二十个最大的点都过了。就是过不了BZ。

看到这道题自己第一发DP是这么推得:

设f[i][j]是第j次分第i个的最大得分。

那么会推出来f[i][j]=max(f[k][j−1]+sum[i k]∗sum[1 k−1]或(sum[k i]∗sum[i+1 n]))然后我发现这个式子的复杂度非常高暂且不说。就光那个或的讨论就非常费劲。

于是想了想就放弃了这个念头。中规中矩的去想。

依照以往的思路设出状态f[i][j]代表前i个分j次的最大得分。

能推出转移方程

f[i][j]=max(f[k][j−1]+sum[k]∗(sum[j]−sum[k]))

之后对于例子手写一遍看出它的正确性后进行后面的讨论

我们发现假设n^2的枚举是肯定不行的。所以才去一种方式进行维护,由于有k的元素的存在,所以从斜率角度入手。

详细推导过程就不写了,得出的结果是:

f[j][tmp异或1]−f[k][tmp异或1]+sum[k]2−sum[j]2sum[k]−sum[j]<=sum[i]

则说明k比j优。

所以尾部就是维护g[j,k]

代码:

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define N 100010
#define K 210
using namespace std;
typedef unsigned long long ll;
ll sum[N],a[N],f[N][2],q[N];
ll n,k;
int tmp;
ll fy(int j1,int j2,int d)
{
return f[j1][d]-f[j2][d]+sum[j2]*sum[j2]-sum[j1]*sum[j1];
}
ll fx(int j1,int j2)
{
return sum[j2]-sum[j1];
}
int main()
{
scanf("%llu%llu",&n,&k);
for(int i=1;i<=n;i++)
{
scanf("%llu",&a[i]);
sum[i]=sum[i-1]+a[i];
}
tmp=0;
for(int j=1;j<=k;j++)
{
tmp^=1;
int head=0,tail=0;
q[head]=0;
for(int i=1;i<=n;i++)
{
while(head<tail&&fy(q[head],q[head+1],tmp^1)<=fx(q[head],q[head+1])*sum[i])head++;
while(head<tail&&fy(q[tail-1],q[tail],tmp^1)*fx(q[tail],i)>=fy(q[tail],i,tmp^1)*fx(q[tail-1],q[tail]))tail--;
int t=q[head];
f[i][tmp]=f[t][tmp^1]+sum[t]*(sum[i]-sum[t]);
q[++tail]=i;
}
}
printf("%llu\n",f[n][tmp]);
}

BZOJ 3675 APIO2014 序列切割 斜率优化DP的更多相关文章

  1. BZOJ 3675 [Apio2014]序列分割 (斜率优化DP)

    洛谷传送门 题目大意:让你把序列切割k次,每次切割你能获得 这一整块两侧数字和的乘积 的分数,求最大的分数并输出切割方案 神题= = 搞了半天也没有想到切割顺序竟然和答案无关...我太弱了 证明很简单 ...

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

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

  3. 【bzoj3675】[Apio2014]序列分割 斜率优化dp

    原文地址:http://www.cnblogs.com/GXZlegend/p/6835179.html 题目描述 小H最近迷上了一个分隔序列的游戏.在这个游戏里,小H需要将一个长度为n的非负整数序列 ...

  4. [APIO2014]序列分割 --- 斜率优化DP

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

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

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

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

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

  7. P3648 [APIO2014]序列分割 斜率优化

    题解:斜率优化\(DP\) 提交:\(2\)次(特意没开\(long\ long\),然后就死了) 题解: 好的先把自己的式子推了出来: 朴素: 定义\(f[i][j]\)表示前\(i\)个数进行\( ...

  8. BZOJ 1010: 玩具装箱toy (斜率优化dp)

    Description P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再放到一种特殊的一维容器中.P教授有编号为1... ...

  9. BZOJ 1010 [HNOI2008]玩具装箱 (斜率优化DP)

    题目链接 http://www.lydsy.com/JudgeOnline/problem.php?id=1010 思路 [斜率优化DP] 我们知道,有些DP方程可以转化成DP[i]=f[j]+x[i ...

随机推荐

  1. BZOJ 4241 历史研究(分块)

    题意 题解 #include<iostream> #include<cstring> #include<cstdio> #include<cmath> ...

  2. Unity Shader (一)ShaderLab 语法

    一.什么是Shader Shader(着色器):是可以在GPU上运行的一段程序,通过Shader可以进行一些渲染相关的设置. 二.什么是ShaderLab 目前面向GPU的编程有三种高级图像语言:HL ...

  3. Java实现断点续传。

    http://www.cnblogs.com/liaojie970/p/5013790.html

  4. COGS——T 21. [HAOI2005] 希望小学

    http://www.cogs.pro/cogs/problem/problem.php?pid=21 ★★   输入文件:hopeschool.in   输出文件:hopeschool.out    ...

  5. 无法往SQL Server Management Studio拖脚本

    解决方法:不要用Administrator权限打开sql server

  6. setTimeOut函数传参数

    这样使用,后面的4000无效 setTimeout(removeGift(customer_id,gift_id),4000); function removeGift(customer_id,gif ...

  7. 23.IDEA 运行junit单元测试方法

    转自:https://blog.csdn.net/weixin_42231507/article/details/80714716 配置Run,增加Junit 最终配置如下:

  8. Android控件-Fragment+ViewPager(高仿微信界面)

    什么是Fragment? Fragment是Android3.0后新增的概念,Fragment名为碎片,不过却和Activity十分相似,具有自己的生命周期,它是用来描述一些行为或一部分用户界面在一个 ...

  9. vmware-images

    https://virtualboxes.org/images/centos/ https://www.osboxes.org/vmware-images/

  10. 对win2012 server 虚拟机hyper-V 硬盘管理,容量变更及新增硬盘

    目的:对win2012 server 虚拟机hyper-V 硬盘管理,容量变更及新增硬盘 一.压缩虚拟机硬盘容量 进入Server 2012的操作系统,打开CMD框,输入:diskmgmt.msc,回 ...