#include <bits/stdc++.h>
int main() {
std::ios_base::sync_with_stdio(false);
std::cin.tie(nullptr);
int n;
std::cin >> n;
std::vector<int> a(2 * n), b(2 * n), buf;
for (auto &i : a) {
std::cin >> i;
buf.push_back(i);
}
for (auto &i : b) {
std::cin >> i;
buf.push_back(i);
}
std::sort(buf.begin(), buf.end());
buf.erase(std::unique(buf.begin(), buf.end()), buf.end());
auto compress = [&](int x) {
return std::lower_bound(buf.begin(), buf.end(), x) - buf.begin();
};
for (auto &i : a) {
i = compress(i);
}
for (auto &i : b) {
i = compress(i);
}
a.push_back(4 * n), b.push_back(4 * n);
std::vector dp(2 * n + 1, std::vector(n + 1, std::vector(3, true)));
for (int i = 2 * n - 1; i >= 0; --i) {
for (int j = 0; j <= n; ++j) {
for (int k = 0; k < 3; ++k) {
dp[i][j][k] = false;
int a_o = a[i], b_o = b[i];
if (k == 1) {
b[i] = 4 * n;
}
if (k == 2) {
a[i] = 4 * n;
}
if (j == n) {
dp[i][n][k] = std::is_sorted(b.begin() + i, b.end());
} else {
if (a[i] <= a[i + 1] and a[i] <= b[i + 1]) {
dp[i][j][k] = dp[i][j][k] or dp[i + 1][j + 1][0];
}
if (a[i] <= a[i + 1]) {
dp[i][j][k] = dp[i][j][k] or dp[i + 1][j + 1][1];
}
if (a[i] <= b[i + 1]) {
dp[i][j][k] = dp[i][j][k] or dp[i + 1][j + 1][2];
}
if (b[i] <= a[i + 1] and b[i] <= b[i + 1]) {
dp[i][j][k] = dp[i][j][k] or dp[i + 1][j][0];
}
if (b[i] <= a[i + 1]) {
dp[i][j][k] = dp[i][j][k] or dp[i + 1][j][1];
}
if (b[i] <= b[i + 1]) {
dp[i][j][k] = dp[i][j][k] or dp[i + 1][j][2];
}
}
a[i] = a_o, b[i] = b_o;
}
}
}
if (!dp[0][0][0]) {
std::cout << "-1\n";
return 0;
}
std::string ans;
for (int i = 0, j = 0, k = 0; i < 2 * n; ++i) {
int a_o = a[i], b_o = b[i];
if (k == 1) {
b[i] = 4 * n;
}
if (k == 2) {
a[i] = 4 * n;
}
if (j == n) {
while (ans.length() < 2 * n) {
ans.push_back('B');
}
break;
}
if (a[i] <= a[i + 1] and a[i] <= b[i + 1] and dp[i + 1][j + 1][0]) {
ans.push_back('A');
j++, k = 0;
} else if (a[i] <= a[i + 1] and dp[i + 1][j + 1][1]) {
ans.push_back('A');
j++, k = 1;
} else if (a[i] <= b[i + 1] and dp[i + 1][j + 1][2]) {
ans.push_back('A');
j++, k = 2;
} else if (b[i] <= a[i + 1] and dp[i + 1][j][0]) {
ans.push_back('B');
k = 0;
} else if (b[i] <= a[i + 1] and dp[i + 1][j][1]) {
ans.push_back('B');
k = 1;
} else if (b[i] <= b[i + 1] and dp[i + 1][j][2]) {
ans.push_back('B');
k = 2;
}
a[i] = a_o, b[i] = b_o;
}
std::cout << ans << '\n';
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |