Submission #211517

#TimeUsernameProblemLanguageResultExecution timeMemory
211517osaaateiasavtnlBuilding 4 (JOI20_building4)C++14
100 / 100
329 ms49620 KiB
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define ii pair <int, int>
#define app push_back
#define all(a) a.begin(), a.end()
#define bp __builtin_popcount
#define ll long long
#define mp make_pair
#define f first
#define s second
#define Time (double)clock()/CLOCKS_PER_SEC

const int N = 1e6 + 7;
int a[2][N];
ii dp[N][2];

void merge(ii &a, ii b) {
    if (a.s < a.f) 
        a = b;
    else
        a = mp(min(a.f, b.f), max(a.s, b.s));
}   

signed main() {
    #ifdef HOME
    freopen("input.txt", "r", stdin);
    #else
    #define endl '\n'
    ios_base::sync_with_stdio(0); cin.tie(0);
    #endif
    int n;
    cin >> n;
    for (int i = 0; i < 2; ++i)
        for (int j = 0; j < 2 * n; ++j)
            cin >> a[i][j];

    for (int i = 0; i < N; ++i)
        for (int j = 0; j < 2; ++j)
            dp[i][j] = mp(N, -N);

    dp[0][0] = mp(0, 0);
    for (int i = 0; i < 2 * n; ++i) {
        for (int t = 0; t < 2; ++t) {
            
            int cur = -1;
            if (i)
                cur = a[t][i - 1];
            for (int add = 0; add < 2; ++add) {
                if (cur <= a[add][i]) {
                    merge(dp[i + 1][add], mp(dp[i][t].f + (add == 0), dp[i][t].s + (add == 0)));
                }
            }   

        }   
    }   

    bool r = 0;
    for (int i = 0; i < 2; ++i)
        if (dp[2 * n][i].f <= n && n <= dp[2 * n][i].s) 
            r = i;
    if (n < dp[2 * n][r].f || n > dp[2 * n][r].s) {
        cout << "-1" << endl;
    }   
    else {
        string ans;
        int cnt = n;
        for (int i = 2 * n; ; --i) {
            if (r)
                ans += 'B';
            else {  
                --cnt;
                ans += 'A';
            }
            if (i == 1)
                break;
            if (a[0][i - 2] <= a[r][i - 1] && dp[i - 1][0].f <= cnt && cnt <= dp[i - 1][0].s)
                r = 0;
            else
                r = 1;
        }   
        reverse(all(ans));
        cout << ans << endl;
    }   
}   
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...