제출 #1135858

#제출 시각아이디문제언어결과실행 시간메모리
1135858daoquanglinh2007건물 4 (JOI20_building4)C++20
0 / 100
0 ms324 KiB
#include <bits/stdc++.h>
using namespace std;

const int NM = 1e6, inf = 1e9+7;

int n, a[NM+5], b[NM+5];
int f[NM+5][2], g[NM+5][2];

void trace(int i, int j, int cur){
    if (i == 0) return;
    if (j == 0){
        if (a[i-1] < a[i] && f[i-1][0] <= cur && g[i-1][0] >= cur) trace(i-1, 0, cur);
        else trace(i-1, 1, cur);
        cout << 'A';
    }
    else{
        cur--;
        if (a[i-1] < b[i] && f[i-1][0] <= cur && g[i-1][0] >= cur) trace(i-1, 0, cur);
        else trace(i-1, 1, cur);
        cout << 'B';
    }
}

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

    cin >> n;
    for (int i = 1; i <= 2*n; i++) cin >> a[i];
    for (int i = 1; i <= 2*n; i++) cin >> b[i];

    for (int i = 1; i <= 2*n; i++){
        f[i][0] = f[i][1] = +inf;
        g[i][0] = g[i][1] = -inf;
    }
    for (int i = 0; i < 2*n; i++){
        if (a[i] < a[i+1]){
            f[i+1][0] = min(f[i+1][0], f[i][0]);
            g[i+1][0] = max(g[i+1][0], g[i][0]);
        }
        if (a[i] < b[i+1]){
            f[i+1][1] = min(f[i+1][1], f[i][0]+1);
            g[i+1][1] = max(g[i+1][1], g[i][0]+1);
        }
        if (b[i] < a[i+1]){
            f[i+1][0] = min(f[i+1][0], f[i][1]);
            g[i+1][0] = max(g[i+1][0], g[i][1]);
        }
        if (b[i] < b[i+1]){
            f[i+1][1] = min(f[i+1][1], f[i][1]+1);
            g[i+1][1] = max(g[i+1][1], g[i][1]+1);
        }
    }
    if (f[2*n][0] <= n && g[2*n][0] >= n){
        trace(2*n, 0, n);
        return 0;
    }
    if (f[2*n][1] <= n && g[2*n][1] >= n){
        trace(2*n, 1, n);
        return 0;
    }
    cout << -1;
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...