Submission #422070

#TimeUsernameProblemLanguageResultExecution timeMemory
422070alextodoranBuilding 4 (JOI20_building4)C++17
100 / 100
294 ms45368 KiB
/**
 ____ ____ ____ ____ ____
||a |||t |||o |||d |||o ||
||__|||__|||__|||__|||__||
|/__\|/__\|/__\|/__\|/__\|

**/

#include <bits/stdc++.h>

using namespace std;

typedef long long ll;

const int N_MAX = 1000000;

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

int n;

int a[N_MAX + 2];
int b[N_MAX + 2];

int L[N_MAX + 2][2];
int R[N_MAX + 2][2];

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    cin >> n;
    n *= 2;
    for(int i = 1; i <= n; i++)
        cin >> a[i];
    for(int i = 1; i <= n; i++)
        cin >> b[i];
    for(int i = 1; i <= n; i++)
    {
        L[i][A] = L[i][B] = INT_MAX / 2;
        R[i][A] = R[i][B] = INT_MIN / 2;
    }
    L[1][A] = 1;
    R[1][A] = 1;
    L[1][B] = 0;
    R[1][B] = 0;
    for(int i = 1; i < n; i++)
    {
        if(a[i] <= a[i + 1])
        {
            L[i + 1][A] = min(L[i + 1][A], L[i][A] + 1);
            R[i + 1][A] = max(R[i + 1][A], R[i][A] + 1);
        }
        if(a[i] <= b[i + 1])
        {
            L[i + 1][B] = min(L[i + 1][B], L[i][A]);
            R[i + 1][B] = max(R[i + 1][B], R[i][A]);
        }
        if(b[i] <= a[i + 1])
        {
            L[i + 1][A] = min(L[i + 1][A], L[i][B] + 1);
            R[i + 1][A] = max(R[i + 1][A], R[i][B] + 1);
        }
        if(b[i] <= b[i + 1])
        {
            L[i + 1][B] = min(L[i + 1][B], L[i][B]);
            R[i + 1][B] = max(R[i + 1][B], R[i][B]);
        }
    }
    bool okA = (L[n][A] <= n / 2 && n / 2 <= R[n][A]);
    bool okB = (L[n][B] <= n / 2 && n / 2 <= R[n][B]);
    if(okA == false && okB == false)
    {
        cout << "-1\n";
        return 0;
    }
    int pos = n;
    int cnt = n / 2;
    int last = (okA == true ? A : B);
    string sol;
    while(pos >= 2)
    {
        if(last == A)
            sol += 'A';
        else
            sol += 'B';
        if(last == A)
        {
            if(a[pos - 1] <= a[pos] && L[pos - 1][A] + 1 <= cnt && cnt <= R[pos - 1][A] + 1)
                last = A;
            else if(b[pos - 1] <= a[pos] && L[pos - 1][B] + 1 <= cnt && cnt <= R[pos - 1][B] + 1)
                last = B;
            cnt--;
        }
        else
        {
            if(a[pos - 1] <= b[pos] && L[pos - 1][A] <= cnt && cnt <= R[pos - 1][A])
                last = A;
            else if(b[pos - 1] <= b[pos] && L[pos - 1][B] <= cnt && cnt <= R[pos - 1][B])
                last = B;
        }
        pos--;
    }
    if(last == A)
        sol += 'A';
    else
        sol += 'B';
    reverse(sol.begin(), sol.end());
    cout << sol << "\n";
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...