E - Perfect Bus Editorial
by
cn449
はじめにバスに乗っている乗客の人数を \(x\) 人とします。
\(i\) 回目の停車での乗客の乗り降りの直後の乗客の人数は \(x + \displaystyle\sum_{k = 1}^{i} A_k\) 人です。
よって条件を整理すると、各 \(0 \leq i \leq N\) について \(x + \displaystyle\sum_{k = 1}^{i} A_k \geq 0\) が成り立つという条件下での \(x + \displaystyle\sum_{k = 1}^{N} A_k\) の最小値が本問題の答えとなります( \(i = 0\) のときは \(\displaystyle\sum_{k = 1}^{i} A_k = 0\) としています)。
各 \(0 \leq i \leq N\) について \(x + \displaystyle\sum_{k = 1}^{i} A_k \geq 0\) が成り立つことは \(\min(x + \displaystyle\sum_{k = 1}^{i} A_k) \geq 0\) が成り立つことと同値で、\(\min(x + \displaystyle\sum_{k = 1}^{i} A_k) = x + \min(\displaystyle\sum_{k = 1}^{i} A_k)\) より \(m \coloneqq \min(\displaystyle\sum_{k = 1}^{i} A_k)\) として \(x + m \geq 0\) のもとで \(x + \displaystyle\sum_{k = 1}^{N} A_k\) を最小化すればよいことがわかります。
これは \(x = -m\) ととればよく、\(m\) の値は累積和の要領で線形時間で計算できます。
実装例
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
int main() {
int n;
cin >> n;
vector<ll> a(n);
for (ll &e : a) cin >> e;
ll m = 0, sum = 0;
for (ll e : a) sum += e, m = min(m, sum);
cout << sum - m << '\n';
}
posted:
last update: