Submission #824836

#TimeUsernameProblemLanguageResultExecution timeMemory
824836xinkBuilding 4 (JOI20_building4)C++14
11 / 100
2084 ms32700 KiB
#include <iostream>
#include <vector>
#include <utility>
#include <sstream>
#include <climits>
#include <cstring>
#include <algorithm>
#define ll long long
#define ld long double
using namespace std;
const ll mod = 1e9 + 7;
const int maxn = 5e5 + 5, maxn1 = 2e3 + 5;
typedef vector<int> vi;
typedef pair<int, int> ii;
typedef vector<ii> vii;
bool can_construct[maxn1][maxn1][2];
int a[2 * maxn], b[2 * maxn];

void solve()
{
    int n;
    cin >> n;
    for (int i = 0; i < 2 * n; i++)
    {
        cin >> a[i];
    }
    for (int i = 0; i < 2 * n; i++)
    {
        cin >> b[i];
    }
    can_construct[1][0][0] = can_construct[0][1][1] = 1;
    for (int i = 0; i <= n; i++)
    {
        for (int j = 0; j <= n; j++)
        {
            if (i + j < 2)
                continue;

            if (i > 1)
                can_construct[i][j][0] |= can_construct[i - 1][j][0] && a[i + j - 1] >= a[i + j - 2];

            if (j > 1)
                can_construct[i][j][1] |= can_construct[i][j - 1][1] && b[i + j - 1] >= b[i + j - 2];

            if (i != 0 && j != 0)
            {
                can_construct[i][j][0] |= can_construct[i - 1][j][1] && a[i + j - 1] >= b[i + j - 2];
                can_construct[i][j][1] |= can_construct[i][j - 1][0] && b[i + j - 1] >= a[i + j - 2];
            }
        }
    }
    if (!can_construct[n][n][0] && !can_construct[n][n][1])
    {
        cout << "-1";
        return;
    }
    string ans;
    int i = n, j = n, last_pos = (can_construct[n][n][0] ? 0 : 1);
    while (i || j)
    {
        if (i == 0 && j == 1)
        {
            ans.push_back('B');
            break;
        }
        if (j == 0 && i == 1)
        {
            ans.push_back('A');
            break;
        }
        if (last_pos == 0)
        {
            ans.push_back('A');
            if (i > 1 && can_construct[i - 1][j][0] && a[i + j - 1] >= a[i + j - 2])
                last_pos = 0;
            else if (i > 0 && j > 0 && can_construct[i - 1][j][1] && a[i + j - 1] >= b[i + j - 2])
                last_pos = 1;
            i--;
        }
        else
        {
            ans.push_back('B');
            if (j > 1 && can_construct[i][j - 1][1] && b[i + j - 1] >= b[i + j - 2])
                last_pos = 1;
            else if (i > 0 && j > 0 && can_construct[i][j - 1][0] && b[i + j - 1] >= a[i + j - 2])
                last_pos = 0;
            j--;
        }
    }
    reverse(ans.begin(), ans.end());
    cout << ans;
}

int main()
{
    // freopen("input_text", "r", stdin);
    // freopen("output_text", "w", stdout);
    // ios_base::sync_with_stdio(NULL); cin.tie(0); cout.tie(0);
    int t = 1;
    // cin >> t;
    while (t-- > 0)
        solve();
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...