#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef tuple <ll,ll,ll> plll;
typedef vector <plll> vplll;
typedef pair <ll,ll> pll;
typedef vector <ll> vll;
typedef vector <pll> vpll;
typedef vector <vector <pll>> vvpll;
typedef vector <vector <ll>> vvll;
typedef vector <bool> vb;
typedef vector <vector <bool>> vvb;
#define loop(i, s, e) for (ll i = (s); i < (e); ++i)
#define loopr(i, e, s) for (ll i = (e)-1; i >= (s); --i)
#define all(a) a.begin(), a.end()
const ll inf = 1e9 + 7;
ll n;
vll a,b;
int main () {
    ios::sync_with_stdio(false);
    cin.tie(NULL);
    cin>>n;
    a.resize(n*2), b.resize(n*2);
    loop(i,0,n*2) cin>>a[i];
    loop(i,0,n*2) cin>>b[i];
    vvpll dp(2*n, vpll(2,{inf, -inf}));
    dp[0][0] = {1,1};
    dp[0][1] = {0,0};
    loop(i,1,2*n) {
        ll aval = a[i], bval = b[i];
        dp[i][0] = {inf, -inf};
        dp[i][1] = {inf, -inf};
        ll L,R;
        if(dp[i-1][0].first <= dp[i-1][0].second && a[i-1] <= aval) {
            L = dp[i-1][0].first + 1;
            R = dp[i-1][0].second + 1;
            dp[i][0].first = min(dp[i][0].first, L);
            dp[i][0].second = max(dp[i][0].second, R);
        }
        if(dp[i-1][1].first <= dp[i-1][1].second && b[i-1] <= aval) {
            L = dp[i-1][1].first + 1;
            R = dp[i-1][1].second + 1;
            dp[i][0].first = min(dp[i][0].first, L);
            dp[i][0].second = max(dp[i][0].second, R);
        }
        if(dp[i-1][0].first <= dp[i-1][0].second && a[i-1] <= bval) {
            L = dp[i-1][0].first;
            R = dp[i-1][0].second;
            dp[i][1].first = min(dp[i][1].first, L);
            dp[i][1].second = max(dp[i][1].second, R);
        }
        if(dp[i-1][1].first <= dp[i-1][1].second && b[i-1] <= bval) {
            L = dp[i-1][1].first;
            R = dp[i-1][1].second;
            dp[i][1].first = min(dp[i][1].first, L);
            dp[i][1].second = max(dp[i][1].second, R);
        }
    }
    pll t0 = dp[2*n-1][0], t1 = dp[2*n-1][1];
    if(!(t0.first <= n && n <= t0.second) && !(t1.first <= n && n <= t1.second)) {
        cout<<-1;
        return 0;
    }
    int st = (t0.first <= n && n <= t0.second ? 0 : 1);
    ll k = n;
    string s(2*n,'?');
    loopr(i,2*n,0) {
        if(st==0) {
            s[i] = 'A';
            --k;
            if(i>0) {
                if(dp[i-1][0].first <= k && k <= dp[i-1][0].second && a[i-1] <= a[i]) st = 0;
                else st = 1;
            }
        } else {
            s[i] = 'B';
            if(i>0) {
                if(dp[i-1][0].first <= k && k <= dp[i-1][0].second && a[i-1] <= b[i]) st = 0;
                else st = 1;
            }
        }
    }
    cout<<s;
    return 0;
}
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... |