BZOJ4518 [Sdoi2016]征途

来源:互联网 发布:淘宝宝贝设置几天发货 编辑:程序博客网 时间:2024/04/30 09:44

裸斜率优化

#include<iostream>#include<cstdio>#include<cstdlib>#include<algorithm>#include<iomanip>#include<cstring>#include<cmath>#include<ctime>#include<vector>#include<stack>#include<queue>#include<set>#include<bitset>#include<map>using namespace std;#define MAXN 3010#define MAXM 10010#define INF 1000000000#define MOD 1000000007#define ll long long#define eps 1e-8ll f[MAXN][MAXN];ll a[MAXN];ll s[MAXN];int q[MAXN][MAXN];int hd[MAXN],tl[MAXN];int n,m;double xl(int x,int y,int z){z--;return 1.0*(f[x][z]-f[y][z]+s[x]*s[x]-s[y]*s[y])/(s[x]-s[y]);}int main(){int i,j,k;scanf("%d%d",&n,&m);for(i=1;i<=n;i++){scanf("%lld",&a[i]);}int tot=0;for(i=1;i<=n;i++){if(a[i]!=0){a[++tot]=a[i];}s[i]=s[i-1]+a[i];}n=tot;q[1][++tl[1]]=0;for(i=1;i<=n;i++){for(j=1;j<=min(m,i);j++){while(hd[j]<tl[j]&&xl(q[j][hd[j]+1],q[j][hd[j]],j)<2*s[i]){hd[j]++;}k=q[j][hd[j]];f[i][j]=f[k][j-1]+(s[i]-s[k])*(s[i]-s[k]);if(j==m){continue ;}while(hd[j+1]<tl[j+1]&&xl(q[j+1][tl[j+1]-1],q[j+1][tl[j+1]],j+1)>xl(q[j+1][tl[j+1]],i,j+1)){tl[j+1]--;}q[j+1][++tl[j+1]]=i;}}printf("%lld\n",f[n][m]*m-s[n]*s[n]);return 0;}/*10 31 2 3 4 5 6 7 8 9 10*/

0 0