个人觉得思路没问题,但是代码只有5分(甚至过不了特殊AB条件的点),但是搞了半天hack不掉自己,求组hack数据/kel
#include <bits/stdc++.h>
using namespace std;
const int N = 100005;
int st[N], top;
int v[N], a[N];
int n, d;
int nxt[N];
inline int read() {
int s = 0; char c = getchar();
while (c < '0' || c > '9') c = getchar();
while (c >= '0' && c <= '9') {
s = s * 10 + int(c - '0');
c = getchar();
}
return s;
}
signed main () {
n = read(); d = read();
for (int i = 2; i <= n; i++) v[i] = read(), v[i] += v[i - 1];
for (int i = 1; i <= n; i++) a[i] = read();
for (int j = n; j >= 1; j--) {
if (top && a[st[top]] > a[j]) top --;
nxt[j] = st[top];
st[++top] = j;
}
for (int i = 1; i <= n; i++) if (nxt[i] == 0) nxt[i] = n;
// for (int i = 1; i <= n; i++) cout<<nxt[i]<<" "; cout<<endl;
int ans = 0, m = 0, now = 1;
while (now < n) {
while (now < n && v[nxt[now]] - v[now] - m <= 0) {
now = nxt[now];
m -= v[nxt[now]] - v[now];
}
if (now == n) break;
int dis = v[nxt[now]] - v[now];
dis -= m;
// cout << dis<<" ";
if (dis % d == 0) {
ans += a[now] * (dis / d); m = 0; now = nxt[now];
}
else {
ans += a[now] * (dis / d + 1); m = (dis / d + 1) * d - dis;
now = nxt[now];
}
// cout << now <<" "<< ans <<" "<<m <<endl;
}
printf("%d\n", ans);
return 0;
}