特别行动队 [APIO 2010]
2016-07-08 16:44
302 查看
分析 I Think
记 fi 表示前 i 个人的最大修正后的战斗力,依题意有 fi=max{fj+a∗(si−sj)2+b∗(si−sj)+c}=max{fj+a∗s2i+a∗s2j−2∗a∗si∗sj+b∗si−b∗sj+c}。设 a∗s2i+b∗si+c=r , fj+a∗s2j=y, sj=x ,2∗a∗si+b=k ,那么上式变成 fi=y−k∗x+r ,也就是 y=k∗x+fi−r 只是一条斜率一定的直线。就可以利用斜率优化将其优化至 O(n) 。代码 Code
#include <cstdio> #include <algorithm> #include <cstring> using namespace std; typedef long long LL; const int Size = 1000047; LL n; LL a,b,c,tmp; LL f[Size]; LL sum[Size]; int que[Size]; int H,T; void read(LL &); LL x(int,int); LL y(int,int); int main(){ read(n); read(a); read(b); read(c); for(int i=1;i<=n;++i){ read(tmp); sum[i] = sum[i-1]+tmp; } f[0] = 0; que[H=0] = 0; T = 1; for(int i=1;i<=n;++i){ while(H+1<T && y(que[H+1],que[H])>=x(que[H+1],que[H])*(b+2*a*sum[i])) ++H; f[i] = f[que[H]]+a*(sum[i]-sum[que[H]])*(sum[i]-sum[que[H]])+b*(sum[i]-sum[que[H]])+c; while(H+1<T && y(i,que[T-1])*x(que[T-1],que[T-2])>=y(que[T-1],que[T-2])*x(i,que[T-1])) --T; que[T++] = i; } printf("%lld",f ); return 0; } void read(LL &_in){ _in = 0; LL flag = 1; char ch = getchar(); while(ch!='-' && (ch>'9'||ch<'0')) ch = getchar(); if(ch == '-'){ flag = -1; ch = getchar(); } while(ch>='0' && ch<='9'){ _in = _in*10+ch-'0'; ch = getchar(); } _in *= flag; } LL x(int i,int j){ return sum[i]-sum[j]; } LL y(int i,int j){ return f[i]-f[j]+a*sum[i]*sum[i]-a*sum[j]*sum[j]; }
相关文章推荐
- [BZOJ1179][APIO2009][Tarjan][拓扑排序][递推]Atm
- BZOJ 1178 APIO 2009 会议中心
- Bzoj4069:[Apio2015]巴厘岛的雕塑:dp+贪心
- Bzoj2809:[Apio2012]dispatching:左偏树
- BZOJ 2809: [Apio2012]dispatching
- [BZOJ3624][Apio2008]免费道路(并查集)
- [BZOJ2809][Apio2012]dispatching(可并堆)
- [BZOJ2811][Apio2012]Guard(线段树+二分+贪心)
- [BZOJ1912][Apio2010]patrol 巡逻(树上最长链)
- 【Apio2009】Bzoj1179 Atm
- 【左偏堆】bzoj2809派遣
- bzoj 2303 Apio2011 方格染色
- [APIO2010] 特别行动队
- bzoj2809 [Apio2012]dispatching
- bzoj3675 [Apio2014]序列分割
- 洛谷1552 APIO2012 派遣
- [bzoj 1911--Apio2010]特别行动队
- [bzoj 3675--Apio2014]序列分割
- [bzoj 1179--Apio2009]Atm
- 【BZOJ1149】【APIO2007】风铃(完全二叉树+dp)