27-5
作者:
kgc
,
2023-01-18 14:48:21
,
所有人可见
,
阅读 169
50分
using namespace std;
typedef long long LL;
const int N = 100010;
int n;
LL m[N],s[N];
LL L,f[N];
LL get_y(int t)
{
return f[t]+s[t]*s[t]+2*L*s[t];
}
void solve(int l,int r)
{
if(l>=r) return;
int mid = l+r>>1;
solve(l,mid);
vector<int> v1,v2;
for(int i=1;i<=n;i++)
{
if(m[i]>=l && m[i]<=mid) v1.push_back(i);
if(m[i]>mid && m[i]<=r) v2.push_back(i);
}
int hh=0,tt=0,q[N],k=0;
q[0] = 0;
for(int i=0;i<v2.size();i++)
{
int t = v2[i];
while(k<v1.size() && v1[k] < t)
{
while(hh<tt && (get_y(v1[k]) - get_y(q[tt])) * (s[q[tt]] - s[q[tt-1]])
<= (get_y(q[tt]) - get_y(q[tt-1])) * (s[v1[k]] - s[q[tt]])) tt--;
q[++tt] = v1[k++];
}
while(hh<tt && get_y(q[hh+1]) - get_y(q[hh]) <= 2 * s[t] * (s[q[hh+1]]-s[q[hh]])) hh++;
int j = q[hh];
f[t] = min(f[t],f[j]+(s[t]-s[j]-L) * (s[t]-s[j]-L));
}
solve(mid+1,r);
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
LL maxm = 0;
cin>>n>>L;
for(int i=1;i<=n;i++) cin>>s[i],s[i]+=s[i-1];
for(int i=1;i<=n;i++) cin>>m[i],maxm = max(maxm,m[i]);
memset(f,0x3f,sizeof f);
f[0] = 0;
solve(0,maxm+1);
cout<<f[n]<<endl;
return 0;
}