洛谷P3628 [APIO2010]特别行动队(斜率优化)
先写出转移方程$$dp[i]=max\{dp[j]+a*(sum[i]-sum[j])^2+b*(sum[i]-sum[j])+c\}$$
假设$j$比$k$更优,则有$$dp[j]+a*(sum[i]-sum[j])^2+b*(sum[i]-sum[j])+c>dp[k]+a*(sum[i]-sum[k])^2+b*(sum[i]-sum[k])+c$$
展开,并消去同类项之后得$$dp[j]-2*a*sum[i]*sum[j]+a*sum[j]^2-b*sum[j]>dp[k]-2*a*sum[i]*sum[k]+a*sum[k]^2-b*sum[k]$$
移项,得$$(dp[j]+a*sum[j]^2-b*sum[j])-(dp[k]+a*sum[k]^2-b*sum[k])>2*a*sum[i]*sum[j]-2*a*sum[i]*sum[k]$$
设$Y[i]=dp[i]+a*sum[i]^2-b*sum[i],X[i]=sum[i]$
则有$$Y[j]-Y[k]>2*a*sum[i]*X[j]-2*a*sum[i]*X[k]$$
$$\frac{Y[j]-Y[k]}{X[j]-X[k]}>2*a*sum[i]$$
那么就是要我们维护一个上凸包,简单来说就是把原来维护下凸包的那些东西给反过来就好了(ps:我今天刚知道原来凸包还能是上凸的……我太菜了……)
//minamoto
#include<iostream>
#include<cstdio>
#define ll long long
using namespace std;
#define getc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++)
char buf[<<],*p1=buf,*p2=buf;
inline int read(){
#define num ch-'0'
char ch;bool flag=;int res;
while(!isdigit(ch=getc()))
(ch=='-')&&(flag=true);
for(res=num;isdigit(ch=getc());res=res*+num);
(flag)&&(res=-res);
#undef num
return res;
}
const int N=;
int sum[N],q[N],h,t,n;ll dp[N],a,b,c;
inline ll Y(int i){return dp[i]+a*sum[i]*sum[i]-b*sum[i];}
inline double slope(int j,int k){return 1.0*(Y(j)-Y(k))/(sum[j]-sum[k]);}
inline ll check(int x){return a*x*x+b*x+c;}
int main(){
//freopen("testdata.in","r",stdin);
n=read(),a=read(),b=read(),c=read();
for(int i=;i<=n;++i) sum[i]=read()+sum[i-];
for(int i=;i<=n;++i){
int k=*a*sum[i];
while(h<t&&slope(q[h],q[h+])>k) ++h;
dp[i]=dp[q[h]]+check(sum[i]-sum[q[h]]);
while(h<t&&slope(q[t],q[t-])<slope(q[t-],i)) --t;q[++t]=i;
}
printf("%lld\n",dp[n]);
return ;
}
洛谷P3628 [APIO2010]特别行动队(斜率优化)的更多相关文章
- 洛谷P3628 [APIO2010]特别行动队 斜率优化
裸题,注意队列下标不要写错 Code: #include<cstdio> #include<algorithm> #include<cmath> using nam ...
- 洛谷P3628 [APIO2010]特别行动队(动态规划,斜率优化,单调队列)
洛谷题目传送门 安利蒟蒻斜率优化总结 由于人是每次都是连续一段一段地选,所以考虑直接对\(x\)记前缀和,设现在的\(x_i=\)原来的\(\sum\limits_{j=1}^ix_i\). 设\(f ...
- [洛谷P3628] [APIO2010]特别行动队
洛谷题目链接:[APIO2010]特别行动队 题目描述 你有一支由 n 名预备役士兵组成的部队,士兵从 1 到 \(n\) 编号,要将他们拆分 成若干特别行动队调入战场.出于默契的考虑,同一支特别行动 ...
- 洛谷 P3628 [APIO2010]特别行动队
题意简述 将n个士兵分为若干组,每组连续,编号为i的士兵战斗力为xi 若i~j士兵为一组,该组初始战斗力为\( s = \sum\limits_{k = i}^{j}xk \),实际战斗力\(a * ...
- bzoj1911[Apio2010]特别行动队 斜率优化dp
1911: [Apio2010]特别行动队 Time Limit: 4 Sec Memory Limit: 64 MBSubmit: 5057 Solved: 2492[Submit][Statu ...
- [APIO2010]特别行动队 --- 斜率优化DP
[APIO2010]特别行动队 题面很直白,就不放了. 太套路了,做起来没点感觉了. \(dp(i)=dp(j)+a*(s(i)-s(j))^{2}+b*(s(i)-s(j))+c\) 直接推出一个斜 ...
- BZOJ 1911: [Apio2010]特别行动队 [斜率优化DP]
1911: [Apio2010]特别行动队 Time Limit: 4 Sec Memory Limit: 64 MBSubmit: 4142 Solved: 1964[Submit][Statu ...
- bzoj 1911: [Apio2010]特别行动队 -- 斜率优化
1911: [Apio2010]特别行动队 Time Limit: 4 Sec Memory Limit: 64 MB Description Input Output Sample Input 4 ...
- APIO2010 特别行动队 & 斜率优化DP算法笔记
做完此题之后 自己应该算是真正理解了斜率优化DP 根据状态转移方程$f[i]=max(f[j]+ax^2+bx+c),x=sum[i]-sum[j]$ 可以变形为 $f[i]=max((a*sum[j ...
随机推荐
- [转】LTE整体架构和协议架构概述
1.1 LTE整体架构 LTE(Long Term Evolution,长期演进)是由3GPP(The 3rd Generation Partnership Project,第三代合作伙伴计划)组织制 ...
- java代码从键盘输入执行次数,数,然后排序
总结:实现从键盘控制执行次数,困惑我很久,直到昨日在提问时,网友说通过循环是肯定可以的所以顿悟了 package com.c2; import java.util.Arrays; import jav ...
- 愿天下有情人都是失散多年的兄妹(bfs)
L2-016. 愿天下有情人都是失散多年的兄妹 时间限制 200 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 呵呵.大家都知道五服以内不得通婚 ...
- C++11 引用叠加规则和模板参数类型推导规则
http://zm8.sm-img2.com/?src=http%3A%2F%2F***%2FArticle%2F38320&uid=57422b713ac761e653af7b327bfd9 ...
- Even uploading a JPG file can lead to Cross-Site Content Hijacking (client-side attack)!
Introduction: This post is going to introduce a new technique that has not been covered previously i ...
- js笔试题一套(未完待续)
1.下面程序的运行结果是: function test(x, y, z) { alert(test.length); alert(arguments.length); alert(arguments. ...
- 11-15SQLserver基础--数据库之范式理论
数据库的设计理论与思路 在设计数据库的时候,有一个著名的设计理论---范式理论. 1.内容: 第一范式:每一列的数据类型要单一,必须要统一: 第二范式:在设计主键的时候,主键尽量更能体现表中的数据信息 ...
- Delphi Android 询问框
Delphi Android 询问框 http://community.embarcadero.com/blogs/entry/xe7-dialog-box-methods-support-anony ...
- UIBezierPath和CAShapeLayer配合肆意画图
一.CAShapeLayer CAShapeLayer 是 CALayer 的子类,但是比 CALayer 更灵活,可以画出各种图形 使用CAShapeLayer 绘制一个矩形 let layer ...
- 关于使用字库-雅黑字体(msyh.ttf )显示中文的一些。。。
开发中有关程序在使用字库 雅黑字体的 的时候 vs下一开始没有显示出中文来,都是乱码. 在android下使用该字体库的时候同样也没有显示出中文,后来搜搜了原因,得知编码必须是UTF-8 也就是使用字 ...