考场 10min 过样例35/ch
#include<bits/stdc++.h>
using namespace std;
const int Maxn = 1000010;
int v[Maxn];
int a[Maxn];
int s[Maxn];
int st[Maxn];
int Min[Maxn];
int l, r;
signed main(){
freopen("road.in","r",stdin);
freopen("road.out","w",stdout);
int n, d;
cin >> n >> d;
for(int i = 1; i < n; i++) cin >> v[i], s[i + 1] = s[i] + v[i];
for(int i = 1; i <= n; i++) cin >> a[i];
for(int i = 1; i < n; i++){
while(a[st[r]] > a[i]){
Min[st[r--]] = i;
}
st[++r] = i;
}
int ans = 0, last = 0;
int i = 1;
while(1){
if(!Min[i]){
int ys;
if((s[n] - s[i] - last) % d == 0) {
last = 0;
ys = (s[n] - s[i] - last) / d;
}else {
ys = (s[n] - s[i] - last) / d + 1;
last = d - (s[n] - s[i] - last) % d;
}
ans += ys * a[i];
cout << ans;
return 0;
}
else {
int ys;
if((s[Min[i]] - s[i] - last) % d == 0) {
last = 0;
ys = (s[Min[i]] - s[i] - last) / d;
}else {
ys = (s[Min[i]] - s[i] - last) / d + 1;
last = d - (s[Min[i]] - s[i] - last) % d;
}
ans += ys * a[i];
i = Min[i];
}
}
cout << ans;
return 0;
}
why?