记录
#include<bits/stdc++.h>
#define ll long long
using namespace std;
struct node{
ll dis;
ll a;
ll z;
}k[100001];
ll n,d;
ll ans=0;
ll rank1[100001];
ll diss[100001];
ll yx=0;
bool cmp(const node &a,const node &b){
if(a.a==b.a)return a.z<b.z;
return a.a<b.a;
}
int main(){
scanf("%d%d",&n,&d);
for(int i=1;i<n;i++){
scanf("%lld",&k[i].dis);
diss[i]=diss[i-1]+k[i].dis;
}
for(int i=1;i<=n;i++){
scanf("%lld",&k[i].a);
k[i].z=i;
}
sort(k+1,k+n,cmp);
if(k[1].z==1){
for(int i=1;i<n;i++){
ans+=k[i].dis;
}
ans=(ans%d==0)?ans/d+1:ans/d;
printf("%d",ans);
return 0;
}
for(int i=1;i<=n;i++){
rank1[k[i].z]=i;
}
int flg1=1;
int flg2=1;
while(flg1<n){
flg2=flg1;
do{
flg2++;
}
while(rank1[flg2]>rank1[flg1]);
if(flg2>n)flg2=n;
if(flg2==flg1)flg2=flg1+1;
if(yx+(diss[flg2-1]-diss[flg1-1])/d*d>=(diss[flg2-1]-diss[flg1-1])){
yx=yx+(diss[flg2-1]-diss[flg1-1])/d*d;
yx-=(diss[flg2-1]-diss[flg1-1]);
ans=ans+((diss[flg2-1]-diss[flg1-1])/d)*k[rank1[flg1]].a;
}else{
yx=yx+((diss[flg2-1]-diss[flg1-1])/d+1)*d;
yx-=(diss[flg2-1]-diss[flg1-1]);
ans=ans+((diss[flg2-1]-diss[flg1-1])/d+1)*k[rank1[flg1]].a;
}
flg1=flg2;
}
printf("%lld",ans);
return 0;
}