Submission #945118

#TimeUsernameProblemLanguageResultExecution timeMemory
945118vjudge1Building 4 (JOI20_building4)C++17
100 / 100
194 ms46928 KiB
#include <iostream>
#include <vector>
#include <algorithm>
#include <cassert>
#include <cstring>
#warning That's the baby, that's not my baby

typedef long long ll;

const int NMAX = 1e6;
const int A = 0;
const int B = 1;

int dpmin[NMAX + 2][2];
int dpmax[NMAX + 2][2];
int pmin[NMAX + 2];
int pmax[NMAX + 2];

int a[NMAX + 2], b[NMAX + 2];

int main() {
#ifndef LOCAL
  std::ios_base::sync_with_stdio(false);
  std::cin.tie(0);
#endif

  int n;
  std::cin >> n;
  n *= 2;

  for (int i = 1; i <= n; i++) {
    std::cin >> a[i];
  }
  for (int i = 1; i <= n; i++) {
    std::cin >> b[i];
  }

  for (int i = 1; i <= n; i++) {
    dpmin[i][A] = dpmin[i][B] = 1e9;
    dpmax[i][A] = dpmax[i][B] = -1e9;
  }

  for (int i = 1; i <= n; i++) {
    if (a[i] >= a[i - 1]) {
      dpmin[i][A] = std::min(dpmin[i][A], dpmin[i - 1][A]);
      dpmax[i][A] = std::max(dpmax[i][A], dpmax[i - 1][A]);
    }
    if (a[i] >= b[i - 1]) {
      dpmin[i][A] = std::min(dpmin[i][A], dpmin[i - 1][B]);
      dpmax[i][A] = std::max(dpmax[i][A], dpmax[i - 1][B]);
    }
    if (b[i] >= a[i - 1]) {
      dpmin[i][B] = std::min(dpmin[i][B], dpmin[i - 1][A] + 1);
      dpmax[i][B] = std::max(dpmax[i][B], dpmax[i - 1][A] + 1);
    }
    if (b[i] >= b[i - 1]) {
      dpmin[i][B] = std::min(dpmin[i][B], dpmin[i - 1][B] + 1);
      dpmax[i][B] = std::max(dpmax[i][B], dpmax[i - 1][B] + 1);
    }
  }

  int m = n / 2;

  if ((dpmin[n][A] <= m && m <= dpmax[n][A]) || (dpmin[n][B] <= m && m <= dpmax[n][B])) {
    std::string answer(n + 1, 'A');
    int c;
    if (dpmin[n][A] <= m && m <= dpmax[n][A]) {
      c = A;
    } else {
      c = B;
    }
    for (int i = n; i > 0; i--) {
      if (c == A) {
        if (a[i] >= a[i - 1]) {
          if (dpmin[i - 1][A] <= m && m <= dpmax[i - 1][A]) {
            c = A;
            continue;
          }
        }
        c = B;
      } else {
        m--;
        answer[i] = 'B';
        if (b[i] >= b[i - 1]) {
          if (dpmin[i - 1][B] <= m && m <= dpmax[i - 1][B]) {
            c = B;
            continue;
          }
        }
        c = A;
      }
    }
    answer.erase(answer.begin());
    std::cout << answer;
  } else {
    std::cout << -1;
  }

  return 0;
}

Compilation message (stderr)

building4.cpp:6:2: warning: #warning That's the baby, that's not my baby [-Wcpp]
    6 | #warning That's the baby, that's not my baby
      |  ^~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...