rt,感觉没问题,但是大样例过不去只有45pts,给个思路也可以。
#include<bits/stdc++.h>
#define int long long
using namespace std;
int v[200005],a[200005],sum[200005],minn = LONG_LONG_MAX;
signed main(){
int n,d;
cin >> n >> d;
for(register int i = 1;i < n;++i){
cin >> v[i];
sum[i] = sum[i - 1] + v[i];
}
for(register int i = 1;i <= n;++i){
cin >> a[i];
minn = min(minn,a[i]);
}
if(minn == a[1])cout << ceil(sum[n - 1] / double(d)) * minn << '\n';
else {
int nowsum = 0,lastoil = 0;
for(register int i = 1;i < n;){
int posnow = i;
while(a[i] >= a[posnow] && i < n)++i;
int nowo = ceil((sum[i - 1] - sum[posnow - 1]) / double(d)) * a[posnow];
if(i == n)nowo = ceil((sum[i - 1] - sum[posnow - 1] - lastoil) / double(d)) * a[posnow];
nowsum += nowo;
int rd = (sum[i - 1] - sum[posnow - 1]);//±¾À´ÐÐ×ߵľàÀë
if(ceil((sum[i - 1] - sum[posnow - 1]) / double(d)) * d > rd)lastoil += ceil((sum[i - 1] - sum[posnow - 1]) / double(d)) * d - rd;
}
cout << nowsum << '\n';
}
return 0;
}