[bzoj4518] [Sdoi2016]征途
2016-04-24 14:46
260 查看
斜率优化。。因为要求方差乘m^2...也就是每段距离与平均值的平方和再乘m。
f[i][j]表示i天后,走了j段的最小平方和。
求出最小平方和再乘个m就行了= =
需要注意,是可以停留在原地的。。。
View Code
f[i][j]表示i天后,走了j段的最小平方和。
求出最小平方和再乘个m就行了= =
需要注意,是可以停留在原地的。。。
#include<cstdio> #include<iostream> #include<cstring> #include<cstdlib> #include<cmath> #define d double #define ll long long using namespace std; const int maxn=3023; int i,j,k,n,m,now,pre,l,r; ll pr[maxn],V[maxn]; int dl[maxn]; d f[2][maxn],v1[maxn]; int ra,fh;char rx; inline int read() { rx=getchar(),ra=0,fh=1; while((rx<'0'||rx>'9')&&rx!='-')rx=getchar(); if(rx=='-')fh=-1,rx=getchar(); while(rx>='0'&&rx<='9')ra*=10,ra+=rx-48,rx=getchar();return ra*fh; } inline d xl(int k1,int k2){//k1<k2 return (d)(f[pre][k2]-f[pre][k1]+V[k2]-V[k1])/(pr[k2]-pr[k1]); } inline d sqr(d x){return x*x;} int main(){ n=read(),m=read(); for(i=1;i<=n;i++)pr[i]=pr[i-1]+read(),V[i]=pr[i]*pr[i]; d avg=(d)pr /m; for(i=0;i<=n;i++)f[0][i]=sqr(pr[i]-avg),v1[i]=(pr[i]-avg); now=1,pre=0; for(i=2;i<=m;i++,swap(now,pre)){ l=1,r=0; for(j=0;j<=n;j++){ while(l<r&&xl(dl[r-1],dl[r])>=xl(dl[r],j))r--; dl[++r]=j; while(l<r&&2*v1[j]>=xl(dl[l],dl[l+1]))l++; f[now][j]=f[pre][dl[l]]+sqr(v1[j]-pr[dl[l]]); } } printf("%lld\n",(ll)(f[pre] *m+0.5)); return 0; }
View Code
相关文章推荐
- Stringbuffer和Stringbuilder
- 北京林业大学“计蒜客”杯程序设计竞赛 网络赛 G. 易彰彪的一张表 (KMP)
- java之多线程
- HashMap源码注解 之 resize()方法(七)
- PHP垃圾回收机制的理解
- 50. Pow(x, n) 【M】【62】
- python的list由多个tuple组成,如何返回每个tuple的每个元素
- uva 562 Dividing coins
- 数据结构算法3_2 迷宫求解
- 微课播放器
- 由于调用了interrupt方法,所以抛出了InterruptedException异常
- ZJOJ Highway Project 3946(单源最短路+贪心)
- 4月24日
- 视差插件parallarx
- 手把手教你如何设计打地鼠游戏(技术教程)
- android 签名被篡改(Keystore was tampered with, or password was incorrect)
- 0424-学习进度条
- iOS 动画Animation - 6 - 2:实战练习之淘宝购物车动画解析
- 搜索——1015
- Hadoop程序开发之——hadoop安装