[APIO2010]特别行动队
题目描述
你有一支由 n 名预备役士兵组成的部队,士兵从 1 到 n 编号,要将他们拆分 成若干特别行动队调入战场。出于默契的考虑,同一支特别行动队中队员的编号 应该连续,即为形如(i, i + 1, ..., i + k)(i,i+1,...,i+k)的序列。 编号为 i 的士兵的初始战斗力为 xi ,一支特别行动队的初始战斗力 x 为队内 士兵初始战斗力之和,即 x = x_i + x_{i+1} + ... + x_{i+k}x=xi+xi+1+...+xi+k。
通过长期的观察,你总结出一支特别行动队的初始战斗力 x 将按如下经验公 式修正为 x':x'= ax^2+bx+cx′:x′=ax2+bx+c,其中 a, b, c 是已知的系数(a < 0)。 作为部队统帅,现在你要为这支部队进行编队,使得所有特别行动队修正后 战斗力之和最大。试求出这个最大和。
例如,你有 4 名士兵, x_1 = 2, x_2 = 2, x_3 = 3, x_4 = 4x1=2,x2=2,x3=3,x4=4。经验公式中的参数为 a = –1, b = 10, c = –20。此时,最佳方案是将士兵组成 3 个特别行动队:第一队包含士兵 1 和士兵 2,第二队包含士兵 3,第三队包含士兵 4。特别行动队的初始战斗力分 别为 4, 3, 4,修正后的战斗力分别为 4, 1, 4。修正后的战斗力和为 9,没有其它 方案能使修正后的战斗力和更大。
网上对斜率优化的解释太玄乎,我看不懂,所以用自己的方法来解释一下斜率优化:
所谓斜率优化,优化的是DP【i】=max(min)(C(i)+C(j)+K(j)*S(i))的dp方程
其中C(i)是只跟i有关的常数,c(j)是和j有关的常数,K(j)和S(i)是分别与ij有关的函数。
整理 得 DP【i】-C(i)=K(j)*S(i)+C(j),我们只要求K(j)*S(i)+C(j)的最值即可。
我们发现每一个J代表一条直线,其自变量为S(i),且S(i)单调递增。
那么我们可以动态的维护一个直线的集合,其K依次递增,C依次递减。(当存在一条直线的K,C都比另一条小时,那它就永远不会成为最优解)。
又因为K依次递增,C依次递减,而且S(i)单调递增,那么一条直线被他后面的直线追上后,就一直比被其追上的直线小了。(两线一交点)。
那么我们就可以这样来维护一个单调队列来优化DP了吗?
答案是否定的。
我们发现了反例。
我们考虑三条直线,y1=10,y2=X+9,y3=100x+1.
显然这三条直线在单调队列中是合法的。
但我们发现 y1和y2的交点在X=1处,y1与y3的交点却在X=0.09处。
按照我们刚才的做法,当X=0.5时,我们还是误以为y1是当前的最优直线,但事实上是y3最优。
所以我们在队尾加入直线时,要判当前要加的直线与前一条直线与前一条直线的前一条直线的交点哪一个在前,如果当前直线的交点在前的话,那就可以将队尾的直线弹出了,因为它已经没有机会成为最优解了。
#include<bits/stdc++.h>
#define B(x) (1ll*a*sum[x]*sum[x]+dp[x]-b*sum[x])//就是题解里的C(j),直线的截距,y=kx+b中的b
#define K(x) (-2ll*a*sum[x])//直线的斜率
#define N 1070001
#define LL long long
#define sight(C) (C<='9'&&C>='0')
using namespace std;
LL sum[N],q[N],n,m,x,head,tail,dp[N],a,b,c;
LL check(int x,int y) {//判断当前直线与i组合的DP值
return dp[y]+a*(sum[x]-sum[y])*(sum[x]-sum[y])+b*(sum[x]-sum[y])+c;
} char C;int B;
double jiao(int x,int y){ //求直线的交点
return 1.0*(B(x)-B(y))/(K(x)-K(y));
}
LL read(LL &x) {
C=getchar(); B=;
for(;!sight(C);C=getchar()) if (C=='-') B=-;
for(x=;sight(C);C=getchar()) x=x*+C-'';
x*=B;
}
int main () {
read(n);
read(a); read(b); read(c);
for (int i=;i<=n;i++)
read(x),sum[i]=sum[i-]+x;
head=tail=;
q[tail++]=;
for (int i=;i<=n;i++) {
while (head+<tail && check(i,q[head])<=check(i,q[head+])) head++;//当前解被超过,将其出队
dp[i]=check(i,q[head]);
while (head+<tail && jiao(q[tail-],i)<=jiao(q[tail-],i)) tail--;//i与q【tail-1】相比,i的交点在前,所以将q【tail-1】删除
q[tail++]=i;
}
printf("%lld\n",dp[n]);
return ;
}
[APIO2010]特别行动队的更多相关文章
- BZOJ 1911: [Apio2010]特别行动队 [斜率优化DP]
1911: [Apio2010]特别行动队 Time Limit: 4 Sec Memory Limit: 64 MBSubmit: 4142 Solved: 1964[Submit][Statu ...
- 【BZOJ 1191】 [Apio2010]特别行动队 (斜率优化)
dsy1911: [Apio2010]特别行动队 [题目描述] 有n个数,分成连续的若干段,每段的分数为a*x^2+b*x+c(a,b,c是给出的常数),其中x为该段的各个数的和.求如何分才能使得各个 ...
- bzoj 1911 [Apio2010]特别行动队(斜率优化+DP)
1911: [Apio2010]特别行动队 Time Limit: 4 Sec Memory Limit: 64 MBSubmit: 3191 Solved: 1450[Submit][Statu ...
- BZOJ 1911: [Apio2010]特别行动队( dp + 斜率优化 )
sum为战斗力的前缀和 dp(x) = max( dp(p)+A*(sumx-sump)2+B*(sumx-sump)+C )(0≤p<x) 然后斜率优化...懒得写下去了... ------- ...
- bzoj1911[Apio2010]特别行动队 斜率优化dp
1911: [Apio2010]特别行动队 Time Limit: 4 Sec Memory Limit: 64 MBSubmit: 5057 Solved: 2492[Submit][Statu ...
- P3628 [APIO2010]特别行动队(斜率优化dp)
P3628 [APIO2010]特别行动队 设$s[i]$为战斗力前缀和 显然我们可以列出方程 $f[i]=f[j]+a*(s[i]-s[j])^{2}+b*(s[i]-s[j])+c$ $f[i]= ...
- [luogu P3628] [APIO2010]特别行动队
[luogu P3628] [APIO2010]特别行动队 题目描述 你有一支由 n 名预备役士兵组成的部队,士兵从 1 到 n 编号,要将他们拆分 成若干特别行动队调入战场.出于默契的考虑,同一支特 ...
- 【bzoj1911】[Apio2010]特别行动队
1911: [Apio2010]特别行动队 Time Limit: 4 Sec Memory Limit: 64 MBSubmit: 4048 Solved: 1913[Submit][Statu ...
- [APIO2010]特别行动队 --- 斜率优化DP
[APIO2010]特别行动队 题面很直白,就不放了. 太套路了,做起来没点感觉了. \(dp(i)=dp(j)+a*(s(i)-s(j))^{2}+b*(s(i)-s(j))+c\) 直接推出一个斜 ...
- bzoj 1911: [Apio2010]特别行动队 -- 斜率优化
1911: [Apio2010]特别行动队 Time Limit: 4 Sec Memory Limit: 64 MB Description Input Output Sample Input 4 ...
随机推荐
- 基于‘BOSS直聘的招聘信息’分析企业到底需要什么样的PHP程序员
原文地址:http://www.jtahstu.com/blog/scrapy_zhipin_php.html 基于'BOSS直聘的招聘信息'分析企业到底需要什么样的PHP程序员 标签(空格分隔): ...
- AspNet Core :创建自定义 EF Core 链接数据库
这两天比较忙,写的会慢一点. 我们以控制台演示 EF Core的链接数据库 首先创建控制台程序 创建数据上下文类 EntityTable /// <summary> /// 继承 DbCo ...
- WINDOWS java 不能正常卸载 问题, (其他系统问题 也可以试试)
1.JAVA 原安装包无法卸载 不知道 有没有通知 碰到过这种情况的 自己碰到过3次这种情况了, 卸载不掉, 在网上 找了N多中 方法, 注册表什么的都被翻烂了, 单还是没用,其中有一次还把 ...
- vue-购物车
最终的实现效果: 需求分析: 购物车需要展示一个已加入购物车的商品列表,包含商品名称,商品单价,购买数量和操作等信息,还需要实时显示购买的总价.其中购买数量可以增加或减少,每类商品还可以从购物车中移除 ...
- flask框架-decorator装饰器
调用包: from functools import wraps 装饰器其实就是一个函数:参数是一个函数,返回值是一个函数 1.装饰器使用是通过@符号,在函数的上面 2.装饰器中定义的函数,要使用*a ...
- Struts2报错org.apache.jasper.JasperException: Invalid directive原因
struts标签书写错误.<s:textfield name="us.username"/>对的<s:textfield name="us.userna ...
- 微信小程序的Web API接口设计及常见接口实现
微信小程序给我们提供了一个很好的开发平台,可以用于展现各种数据和实现丰富的功能,通过小程序的请求Web API 平台获取JSON数据后,可以在小程序界面上进行数据的动态展示.在数据的关键 一环中,我们 ...
- springboot整合系列
Spring Boot 系列 博客原文:http://blog.csdn.net/isea533/article/details/50412212 Spring Boot 入门 Spring Boot ...
- springmvc中@PathVariable传Double精度丢失
页面请求 http://localhost:8080/test/3.201 后端接受数据 /** * 测试 * * @param number */ @RequestMapping(value = & ...
- NodeJs学习笔记(四)---单元测试
sailsjs框架用了一段时间了,感觉如果功能复杂了,非常难以处理,想用一下单元测试,看是否能解决问题. sailsjs的官方文档使用的是mocha,我搜索了一些资料,主要参考了朴灵 ...