Submission #1047819

#TimeUsernameProblemLanguageResultExecution timeMemory
1047819vjudge1Building 4 (JOI20_building4)C++17
100 / 100
169 ms108252 KiB
#include <iostream>
#include <complex>
#include <iomanip>
#include <vector>
#include <algorithm>
#include <functional>
#include <bitset>
#include <queue>
#include <map>
#include <stack>
#include <cmath>
#include <cstdint>
using namespace std;

#define endl '\n'
#define db double
#define ll __int128
#define int long long
#define pb push_back
#define fs first
#define sd second
#define Mod long(1e9 + 7)
#define all(x) x.begin(), x.end()
#define unvisited long(-1)
#define Eps double(1e-9)
#define _for(i, n) for(int i = 0; i < (n); i++)
#define dbg(x) cout << #x ": " << x << endl;

const int Max = 1e6 + 7, Inf = 1e9 + 7;

void print(bool x) { cout << (x ? "YES" : "NO") << endl; }

string tostring (__int128 x)
{
    string ans = "";
    while(x > 0)
    {
        ans += (x % 10 + '0');
        x /= 10;
    }
    reverse(all(ans));
    return ans;
}

pair <int, int> merge(pair<int, int> a, pair <int, int> b, int c){
    return { min(a.fs, b.fs + c), max(a.sd, b.sd + c ) };
}

void solve()
{
    int n; cin >> n; 
    vector <int> a(2*n), b(2*n);
    for(auto& u : a) cin >> u; 
    for(auto& u : b) cin >> u; 
    vector <vector<pair<int, int>>> dp(2*n, 
        vector <pair<int, int>> (2, { Inf, -Inf}));

    string ans = "";

    dp[0][0] = { 1, 1 };
    dp[0][1] = { 0, 0 };

    _for(i, 2*n-1){
        if(a[i] <= a[i+1]) dp[i+1][0] = merge(dp[i+1][0], dp[i][0], 1);
        if(a[i] <= b[i+1]) dp[i+1][1] = merge(dp[i+1][1], dp[i][0], 0);
        if(b[i] <= a[i+1]) dp[i+1][0] = merge(dp[i+1][0], dp[i][1], 1);
        if(b[i] <= b[i+1]) dp[i+1][1] = merge(dp[i+1][1], dp[i][1], 0);
         //cerr << i << " " << dp[i][0].fs << " " << dp[i][0].sd << " " 
         //    << dp[i][1].fs << " " << dp[i][1].sd << endl;
    }

    int cnt = n, last = Inf;

    for(int i = 2*n-1; i >= 0; i--)
    {   //cerr << i << " " << dp[i][0].fs << " " << dp[i][0].sd << " " 
        //     << dp[i][1].fs << " " << dp[i][1].sd << endl;
        if(dp[i][0].fs <= cnt && cnt <= dp[i][0].sd && a[i] <= last){
            ans += 'A'; last = a[i]; cnt--;
        } else if(dp[i][1].fs <= cnt && cnt <= dp[i][1].sd && b[i] <= last){
            ans += 'B'; last = b[i];
        } else {
            cout << -1 << endl;
            return;
        }
    } 
    
    reverse(all(ans));

    cout << ans << endl;
}   

int32_t main()
{
   ios_base::sync_with_stdio(0);
   cin.tie(0);

    int Q = 1; //cin >> Q;

    while (Q--)
    {
        solve();
    }

    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...