CodeForces - 948C(前缀和 + 二分)
题意:N天,每天生产一堆雪体积 V[i] ,每天每堆雪融化 T[i],问每天融化了多少雪。
题解:对 T 求前缀和,求每一堆雪能熬过多少天,再记录一下多余的就行了。
#include <bits/stdc++.h> using namespace std; const int maxn = 1e5 + 10; int N; int V[maxn], T[maxn]; long long S[maxn], E[maxn], D[maxn], X[maxn]; int main() { scanf("%d", &N); for(int i = 1; i <= N; i++) scanf("%d", &V[i]); for(int i = 1; i <= N; i++) scanf("%d", &T[i]); for(int i = 1; i <= N; i++) S[i] = S[i - 1] + T[i]; for(int i = 1; i <= N; i++){ int l = i, r = N; while(l <= r){ int m = (l + r) >> 1; if(V[i] >= S[m] - S[i - 1]) l = m + 1; else r = m - 1; } E[i]++; E[l]--; D[l] += V[i] - (S[r] - S[i - 1]); } for(int i = 1; i <= N; i++) X[i] = X[i - 1] + E[i]; for(int i = 1; i <= N; i++) printf("%lld%c", X[i] * T[i] + D[i], i == N ? '\n' : ' '); return 0; }