Official
A - Two Sequences 2 Editorial by camypaper
\(c_n\) は \(c_{n} = \max(c_{n-1}, \max(a_1, a_2, \ldots,a_n)b_n)\) と表すことができます。 ここから、\(c_n\) は \(c_{n-1}\) と \(a\) の先頭 \(n\) 個の最大値と \(b_n\) をかけた値の大きい方になることがわかります。
\(a\) の先頭 \(n\) 個の最大値は容易に求められます。\(c_{1} = a_{1}b_{1}\) より、\(c_1\) も容易に求めることができます。よって、 \(c_2,c_3,\ldots,c_N\) をこの順に求めればよく結局 \(O(N)\) でこの問題を解くことができ、\(N \leq 2 \times 10^5\) より十分高速です。
#include <algorithm>
#include <iostream>
#include <vector>
using ll = long long;
using namespace std;
const char EOLN = '\n';
int n;
int main() {
cin >> n;
vector<ll> a(n), b(n), c(n);
for (int i = 0; i < n; i++) cin >> a[i];
for (int i = 0; i < n; i++) cin >> b[i];
ll ma = a[0];
c[0] = a[0] * b[0];
for (int i = 1; i < n; i++) {
ma = max(ma, a[i]);
c[i] = max(c[i - 1], ma * b[i]);
}
for (int i = 0; i < n; i++) cout << c[i] << endl;
return 0;
}
posted:
last update: