제출 #211596

#제출 시각아이디문제언어결과실행 시간메모리
211596M0REDA건물 4 (JOI20_building4)C++14
0 / 100
6 ms768 KiB
#include <bits/stdc++.h>
#define debug(x) cerr << #x << " = " << x << ", ";
#define ll long long
#define pb push_back
using namespace std;
#define FAST_IO                       \
    ios_base::sync_with_stdio(false); \
    cin.tie(NULL);                    \
    cout.tie(NULL);
const int MAX = 2 * 500000;
ll n, len;
// vector<ll> a, b;
// string ans = "";
// bitset<MAX> bit;
// void solve1(ll curr)
// {
//     if (ans != "")
//         return;
//     if (curr == len)
//     {
//         if (bit.count() == n && ans == "")
//         {
//             for (int i = 0; i < len; i++)
//             {
//                 if (bit[i])
//                     ans += "A";
//                 else
//                     ans += "B";
//             }
//             cout << ans << endl;
//         }
//     }
//     else if (curr < len)
//     {
//         ll last = (bit[curr - 1] ? a[curr - 1] : b[curr - 1]);
//         if (a[curr] >= last)
//         {
//             bit[curr] = 1;
//             if (curr + 1 <= len)
//                 solve1(curr + 1);
//             bit[curr] = 0;
//         }
//         if (b[curr] >= last)
//         {
//             if (curr + 1 <= len)
//                 solve1(curr + 1);
//         }
//     }
// }
int main()
{
    FAST_IO
    cin >> n;
    len = 2 * n;
    // a.resize(len);
    // b.resize(len);
    vector<vector<ll>> v(len, vector<ll>(2)); // v[i][0] = b , v[i][1] = a
    for (int i = 0; i < len; i++)
    {
        // cin >> a[i];
        cin >> v[i][1];
    }
    for (int i = 0; i < len; i++)
    {
        // cin >> b[i];
        cin >> v[i][0];
    }
    vector<vector<pair<ll, ll>>> dp(len, vector<pair<ll, ll>>(2));
    for (int i = 0; i < len; i++)
    {
        dp[i][0] = {-1, -1};
        dp[i][1] = {-1, -1};
    }
    dp[0][0] = {0, 0};
    dp[0][1] = {1, 1};
    for (int i = 0; i < len - 1; i++)
    {
        for (int prev = 0; prev < 2; prev++)
        {
            if (dp[i][prev] != make_pair((ll)-1, (ll)-1))
            {
                for (int nxt = 0; nxt < 2; nxt++)
                {
                    pair<ll, ll> pp;
                    if (v[i][prev] > v[i + 1][nxt])
                    {
                        // cout << "prev is " << v[i][prev] << " nxt is " << v[i + 1][nxt] << endl;
                        continue;
                    }
                    // cout << "prev is " << v[i][prev] << " nxt is " << v[i + 1][nxt] << endl;

                    pp = {dp[i][prev].first + nxt, dp[i][prev].second + nxt};
                    if (dp[i + 1][nxt] == make_pair((ll)-1, (ll)-1))
                    {
                        // debug(prev);
                        // debug(i + 1);
                        // debug(nxt);
                        // cout << endl;
                        // cout << endl;

                        // cout << "        " << pp.first << " pp " << pp.second << endl;
                        // cout << "==============================" << endl;
                        dp[i + 1][nxt] = pp;
                    }
                    else
                    {
                        dp[i + 1][nxt] = {min(dp[i + 1][nxt].first, pp.first), max(dp[i + 1][nxt].second, pp.second)};
                    }
                }
            }
        }
    }
    ll cnt = n;
    string ans = "";
    if (!((dp[len - 1][0].first <= n && dp[len - 1][0].second >= n) || (dp[len - 1][1].first <= n && dp[len - 1][1].second >= n)))
    {
        cout << -1 << endl;
        return 0;
    }
    for (int i = len - 1; i >= 0; i--)
    {
        for (int nxt = 0; nxt < 2; nxt++)
        {
            if (dp[i][nxt].first <= cnt && cnt <= dp[i][nxt].second)
            {
                // debug(dp[i][nxt].first);
                // debug(dp[i][nxt].second);
                // debug(cnt);
                // debug(nxt);
                // cout << endl;
                // cout << " =============== " << endl;
                if (nxt == 1)
                {
                    cnt--;
                    ans += "A";
                }
                else
                    ans += "B";
                break;
            }
        }
    }
    reverse(ans.begin(), ans.end());
    // cout << ans.size() << endl;
    cout << ans << endl;
    // solve1(1);
    // if (ans == "")
    // {
    //     bit[0] = 1;
    //     solve1(1);
    // }
    // if (ans == "")
    //     cout << -1 << endl;
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...