//公路
//出现long long类型时,最好统一定义成ll类型,别出现int
#include<iostream>
using namespace std;
const int maxn=100000;
#define ll long long
int n,d;
struct ND
{
ll a; //记录油价
ll v; //记录距离
ll sum;//距离后缀和
}nd[maxn+10];
ll b[maxn+10],c[maxn+10];
// 分别记录降序油价及对应的序列
ll dis[maxn+10];
ll cmp(ll a,ll b)
{
if(a-b<0) return 1;
return 0;
}
int main()
{
cin>>n>>d;
for(ll i=1;i<=n-1;i++) cin>>nd[i].v;
for(ll i=1;i<=n;i++)
{
cin>>nd[i].a;
}
nd[n].sum=0;
for(int ll i=n-1;i>=1;i--)
{
nd[i].sum=nd[i+1].sum+nd[i].v;
}
ll cnt=1;
b[1]=nd[1].a;
c[1]=1;
for(ll i=2;i<=n;i++)
{
if(i!=n)
{
if(b[cnt]>nd[i].a)
{
ll pos=c[cnt];
dis[cnt]=nd[pos].sum-nd[i].sum;
b[++cnt]=nd[i].a;
c[cnt]=i;
}
}
else
{
ll pos=c[cnt];
dis[cnt]=nd[pos].sum-nd[n].sum;
b[++cnt]=nd[i].a;
c[cnt]=i;
}
}
ll res=0;//总花费
ll tmp=0;//到达一个新加油站剩余可行驶路程数
for(ll i=1;i<cnt;i++)
{
if(cmp(tmp,dis[i]))
{
ll s=dis[i]-tmp;
ll x=(s%d==0)?(s/d):(s/d+1); //当前购买x油
res+=x*b[i];//累加花销
tmp+=(x*d-dis[i]); //到达下一个加油站剩余路程数
}
else tmp-=dis[i];
}
cout<<res<<endl;
return 0;
}//老师的代码
理解了老师的代码