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: