特别行动队
2016-07-08 16:50
351 查看
Solution
设 f[x] 表示特别行动队前 x 名士兵编好队的最大战斗力。f[x]=maxi−1k=0fk+a[A(i)−A(k)]x+b[A(i)−A(k)]+c
化简、移项:得到斜率方程:
f[k]−f[j]+a[A2(k)−A2(j)]−b[A(k)−A(j)]>2aA(i)⋅[A(k)−A(j)]
然后就可以斜率优化了。
Code
#include <iostream> #include <cstdio> #define LL long long #define Min(x,y) ((x)<(y)?(x):(y)) #define Pow(x) ((x)*(x)) using namespace std; LL n,a,b,c,Max_Right,Lastcost,INF=9223372036854777LL; LL A[1000010],As[1000010]; LL f[1000010],fs[1000010]; double ks[1000010]; inline void in(LL &x){ char ch=getchar();x=0;LL flag=1; while((ch<'0'||ch>'9')&&ch!='-')ch=getchar(); if(ch=='-')flag=-1,ch=getchar(); while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar(); x*=flag; } double get_y(LL x){ return (double)f[x]/(2*a)+(double)Pow(A[x])/2-(double)b*A[x]/(2*a); } double get_k(LL x,LL y){ return (double)((double)fs[x]/(2*a)+(double)Pow(As[x])/2-(double)b*As[x]/(2*a)-get_y(y))/(As[x]-A[y]); } int main(){ freopen("commando.in","r",stdin); freopen("commando.out","w",stdout); in(n); in(a);in(b);in(c); for(LL i=1,tmp;i<=n;i++){ in(tmp); A[i]=A[i-1]+tmp; } ks[Max_Right]=-INF;ks[Max_Right+1]=INF; for(LL i=1;i<=n;i++){ for(LL j=Lastcost;j<=Max_Right;j++) if(A[i]>=ks[j]&&A[i]<=ks[j+1]){ Lastcost=j; f[i]=fs[j]+a*Pow(A[i]-As[j])+b*(A[i]-As[j])+c; break; } for(LL k=Max_Right;k>=0;k--){ double tmp=get_k(k,i); if(tmp>=ks[k]){ Max_Right=k+1; ks[k+1]=tmp;ks[k+2]=INF;fs[k+1]=f[i]; As[k+1]=A[i];Lastcost=Min(Lastcost,Max_Right); break; } } } printf("%lld\n",f ); return 0; }
相关文章推荐
- 一个程序员的进化史-第八章
- android 蓝牙BLE扫描和wifi扫描总结
- IE8/IE9下Ajax缓存问题
- Layer3 BGP-5 路由属性
- MacBook下如何配置xampp中使用mysql的环境变量
- 平衡搜索树--红黑树 RBTree
- 洛谷P1090 合并果子 (优先队列伪STL)
- Matlab导出动态链接库dll
- CSS3实践之路(六):CSS3的过渡效果(transition)与动画(animation)
- 《APUE.3E》用gdb调试ftw函数(图4-22)
- sqlplus登录数据库
- 运用蓝牙的步骤及方法的总结
- css3中transition属性详解
- [JZOJ4596] Stree(t)
- 通过xrdp协议远程连接 ubuntu虚拟机
- Android自定义View——仿QQ等级天数进度
- mysql索引总结----mysql 索引类型以及创建
- laracel中ajax删除一条数据的 (注意提交_method:delete; _token:{{csrf_token()}})
- 墨卡托投影C#实现
- Passbook(Wallet)学习笔记