笔记-[APIO2010]特别行动队
2024-09-03 21:58:01
笔记-[APIO2010]特别行动队
\(f_i\) 表示将 \((j+1,j+2,\dots,i)\) 分为一组,已解决 \(i\) 之前的士兵的最小代价。
\(a<0\)。
\[\begin{split}
f_i=&\max\{f_j+aX^2+bX+c\}(j<i)\\
=&\max\{f_j+a\left(\sum_{h=j+1}^ix_h\right)^2+b\left(\sum_{h=j+1}^ix_h\right)+c\}\\
\end{split}
\]
f_i=&\max\{f_j+aX^2+bX+c\}(j<i)\\
=&\max\{f_j+a\left(\sum_{h=j+1}^ix_h\right)^2+b\left(\sum_{h=j+1}^ix_h\right)+c\}\\
\end{split}
\]
设 \(s_i=\sum_{h=1}^i x_h\):
\[\begin{split}
f_i=&\max\{f_j+a\left(\sum_{h=j+1}^ix_h\right)^2+b\left(\sum_{h=j+1}^ix_h\right)+c\}\\
=&\max\{f_j+a(s_i-s_j)^2+b(s_i-s_j)+c\}\\
=&\max\{f_j+a(s_i^2-2s_is_j+s_j^2)+b(s_i-s_j)+c\}\\
=&\max\{f_j+as_i^2-2as_is_j+as_j^2+bs_i-bs_j+c\}\\
=&\max\{f_j-2as_is_j+as_j^2-bs_j\}+as_i^2+bs_i+c\\
\end{split}
\]
f_i=&\max\{f_j+a\left(\sum_{h=j+1}^ix_h\right)^2+b\left(\sum_{h=j+1}^ix_h\right)+c\}\\
=&\max\{f_j+a(s_i-s_j)^2+b(s_i-s_j)+c\}\\
=&\max\{f_j+a(s_i^2-2s_is_j+s_j^2)+b(s_i-s_j)+c\}\\
=&\max\{f_j+as_i^2-2as_is_j+as_j^2+bs_i-bs_j+c\}\\
=&\max\{f_j-2as_is_j+as_j^2-bs_j\}+as_i^2+bs_i+c\\
\end{split}
\]
考虑 \(j=k\) 比 \(j=t\) 更优:
\[\begin{split}
f_k-2as_is_k+as_k^2-bs_k>&f_t-2as_is_t+as_t^2-bs_t\\
f_k-2as_is_k+as_k^2-bs_k>&f_t-2as_is_t+as_t^2-bs_t\\
(f_k+as_k^2-bs_k)-(f_t+as_t^2-bs_t)>&2as_is_k-2as_is_t\\
\frac{(f_k+as_k^2-bs_k)-(f_t+as_t^2-bs_t)}{s_k-s_t}>&2as_i\\
\end{split}
\]
f_k-2as_is_k+as_k^2-bs_k>&f_t-2as_is_t+as_t^2-bs_t\\
f_k-2as_is_k+as_k^2-bs_k>&f_t-2as_is_t+as_t^2-bs_t\\
(f_k+as_k^2-bs_k)-(f_t+as_t^2-bs_t)>&2as_is_k-2as_is_t\\
\frac{(f_k+as_k^2-bs_k)-(f_t+as_t^2-bs_t)}{s_k-s_t}>&2as_i\\
\end{split}
\]
搞定。
Code
#include <bits/stdc++.h>
using namespace std;
//Start
#define re register
#define il inline
#define mk make_pair
#define pb push_back
#define db double
#define lng long long
#define fi first
#define se second
const int inf=0x3f3f3f3f;
const lng INF=0x3f3f3f3f3f3f3f3f;
//Data
int n,a,b,c;
vector<int> x;
vector<lng> s,f;
//DP
template<typename T> il T p2(re T x){return x*x;}
il db fx(re int x){return s[x];}
il db fy(re int x){return f[x]+p2(s[x])*a-s[x]*b;}
il db slope(re int k,re int t){return (fy(k)-fy(t))/(fx(k)-fx(t));}
il lng DP(){
re int l=1,r=0; re vector<int> q(n+7); q[++r]=0;
for(re int i=1;i<=n;i++){
while(l<r&&slope(q[l],q[l+1])>=s[i]*2*a) l++;
f[i]=f[q[l]]+p2(s[i]-s[q[l]])*a+(s[i]-s[q[l]])*b+c;
while(l<r&&slope(q[r-1],q[r])<=slope(q[r],i)) r--;
q[++r]=i;
}
return f[n];
}
//Main
int main(){
scanf("%d%d%d%d",&n,&a,&b,&c);
x=vector<int>(n+7);
s=f=vector<lng>(n+7);
for(re int i=1;i<=n;i++)
scanf("%d",&x[i]),s[i]=s[i-1]+x[i];
printf("%lld\n",DP());
return 0;
}
\[\Huge\color{#ddd}{\texttt{---END---}}
\]
\]
最新文章
- 全局唯一ID设计
- 完美者的代言-ArrayList线程安全问题
- Scrum Meeting 8-20151210
- GoldenGate 12.2 支持不可见列invisible column的复制
- 【POJ】1151 Atlantis(线段树)
- plsql记住登录密码
- UseAdaptiveSizePolicy与CMS垃圾回收同时使用导致的JVM报错
- malloc函数的底层实现你是否清楚
- sqlserver中的聚合函数
- Ch05 视图模型
- Common Lisp第三方库介绍 | (R "think-of-lisper" 'Albertlee)
- java中线程机制
- Exclusive-OR(带权并查集)
- HTML状态码大全(301,404,500等)
- Lenghth of Last Word
- 【UML】NO.53.EBook.5.UML.1.013-【UML 大战需求分析】- 组合结构图(Composition Structure Diagram)
- Luogu4338 ZJOI2018 历史 LCT、贪心
- angularjs为ng-click事件传递参数
- 线程池(ThreadPool)
- Zookeeper 3.4.8分布式安装
热门文章
- 04 . Vue组件注册,组件间数据交互,调试工具及组件插槽介绍及使用
- Ceph的Mon数据重新构建工具
- 入坑 docsify,一款神奇的文档生成利器!
- burp插件之跨站payload批量注入-xssValidator
- PHP中的变量覆盖漏洞
- OxyPlot组件的基本使用
- 面试官:小伙子,你给我说一下Java Exception 和 Error 的区别吧?
- FL studio系列教程(十一):FL Studio中如何混音
- 设置searchDisplayController的searchResultsTableView的UITableViewStyle为grouped
- Spring5.0源码学习系列之Spring AOP简述