P9225 题解
honglan0301 · · 题解
题目分析
首先按照编号从小到大地考虑机器,可以发现当考虑到第
第一个优化,根据
第二个优化,再考虑能否快速转移。我们列式子有
代码
/*
author: PEKKA_l
*/
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>
using namespace std;
#define int long long
int n,a[1005],b[1005],dp[9005],g[9005],head,tail,q[9005];
int gety(int x,int k) {return g[k]+k*(k+1)*b[x]/2-a[x]*k;}
signed main()
{
cin>>n; for(int i=1;i<=n;i++) cin>>a[i]; for(int i=1;i<=n;i++) cin>>b[i];
for(int i=0;i<=9000;i++) dp[i]=a[1]*i+b[1]*(i-1)*i/2;
for(int i=2;i<=n;i++)
{
for(int j=1;j<=4500;j++) {g[j]=dp[j<<1]; g[j+4500]=100000000000000000;} head=tail=1;
for(int j=1;j<=9000;j++)
{
while(head<tail&&(double)(gety(i,q[tail])-gety(i,q[tail-1]))/(q[tail]-q[tail-1])>=(double)(gety(i,j)-gety(i,q[tail]))/(j-q[tail])) tail--;
q[++tail]=j;
while(head<tail&&b[i]*j>=(double)(gety(i,q[head+1])-gety(i,q[head]))/(q[head+1]-q[head])) head++;
dp[j]=g[q[head]]+a[i]*(j-q[head])+(j-q[head]-1)*(j-q[head])*b[i]/2;
}
}
cout<<dp[1]<<endl;
}