제출 #1325891

#제출 시각아이디문제언어결과실행 시간메모리
1325891sh_qaxxorov_571건물 4 (JOI20_building4)C++20
100 / 100
266 ms119960 KiB
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>

using namespace std;

const int INF = 1e9;

int main() {
    ios::sync_with_stdio(false);
    cin.tie(0);

    int n;
    cin >> n;
    int len = 2 * n;
    vector<int> a(len), b(len);
    for (int i = 0; i < len; i++) cin >> a[i];
    for (int i = 0; i < len; i++) cin >> b[i];

    // dpMin[i][0] - i-binoda 'A' tanlansa, hozirgacha tanlangan 'A'larning min soni
    // dpMax[i][0] - i-binoda 'A' tanlansa, hozirgacha tanlangan 'A'larning max soni
    // [i][1] esa 'B' tanlangan holat uchun
    vector<vector<int>> dpMin(len, vector<int>(2, INF));
    vector<vector<int>> dpMax(len, vector<int>(2, -INF));

    // Boshlang'ich holat
    dpMin[0][0] = dpMax[0][0] = 1;
    dpMin[0][1] = dpMax[0][1] = 0;

    for (int i = 1; i < len; i++) {
        // Hozir 'A' tanlasak (a[i])
        if (a[i] >= a[i-1]) {
            dpMin[i][0] = min(dpMin[i][0], dpMin[i-1][0] + 1);
            dpMax[i][0] = max(dpMax[i][0], dpMax[i-1][0] + 1);
        }
        if (a[i] >= b[i-1]) {
            dpMin[i][0] = min(dpMin[i][0], dpMin[i-1][1] + 1);
            dpMax[i][0] = max(dpMax[i][0], dpMax[i-1][1] + 1);
        }

        // Hozir 'B' tanlasak (b[i])
        if (b[i] >= a[i-1]) {
            dpMin[i][1] = min(dpMin[i][1], dpMin[i-1][0]);
            dpMax[i][1] = max(dpMax[i][1], dpMax[i-1][0]);
        }
        if (b[i] >= b[i-1]) {
            dpMin[i][1] = min(dpMin[i][1], dpMin[i-1][1]);
            dpMax[i][1] = max(dpMax[i][1], dpMax[i-1][1]);
        }
    }

    // Natijani tiklash (Backtracking)
    int currentA;
    int lastVal = 2e9; // Juda katta son
    string res = "";

    if (n >= dpMin[len-1][0] && n <= dpMax[len-1][0]) currentA = 0;
    else if (n >= dpMin[len-1][1] && n <= dpMax[len-1][1]) currentA = 1;
    else {
        cout << -1 << endl;
        return 0;
    }

    int remainingN = n;
    for (int i = len - 1; i >= 0; i--) {
        if (currentA == 0) {
            res += 'A';
            remainingN--;
            lastVal = a[i];
        } else {
            res += 'B';
            lastVal = b[i];
        }

        if (i > 0) {
            // Avvalgi qadamda qaysi biri to'g'ri kelishini tekshiramiz
            if (a[i-1] <= lastVal && remainingN >= dpMin[i-1][0] && remainingN <= dpMax[i-1][0]) {
                currentA = 0;
            } else {
                currentA = 1;
            }
        }
    }

    reverse(res.begin(), res.end());
    cout << res << endl;

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