Submission #212961

#TimeUsernameProblemLanguageResultExecution timeMemory
212961jovan_bBuilding 4 (JOI20_building4)C++17
100 / 100
348 ms69868 KiB
#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
typedef long double ld;

const int INF = 1000000007;

int a[1000005];
int b[1000005];
pair <int, int> dp[1000005][2];

string res = "";

void uradi(int n, int koji, int kolko){
    if(n == 1){
        if(koji == 0) res += 'A';
        else res += 'B';
        return;
    }
    if(koji == 0){
        if(a[n] >= a[n-1] && dp[n-1][0].first <= kolko && dp[n-1][0].second >= kolko) uradi(n-1, 0, kolko-1);
        else uradi(n-1, 1, kolko);
        res += 'A';
    }
    else{
        if(b[n] >= a[n-1] && dp[n-1][0].first <= kolko && dp[n-1][0].second >= kolko) uradi(n-1, 0, kolko-1);
        else uradi(n-1, 1, kolko);
        res += 'B';
    }
}

int main(){
    ios_base::sync_with_stdio(false), cin.tie(0);
    cout.precision(10);
    cout << fixed;

	int n;
	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++){
        dp[i][0] = dp[i][1] = {INF, -INF};
        if(a[i] >= a[i-1]){
            dp[i][0].second = max(dp[i][0].second, dp[i-1][0].second+1);
            dp[i][0].first = min(dp[i][0].first, dp[i-1][0].first+1);
        }
        if(a[i] >= b[i-1]){
            dp[i][0].second = max(dp[i][0].second, dp[i-1][1].second+1);
            dp[i][0].first = min(dp[i][0].first, dp[i-1][1].first+1);
        }
        if(b[i] >= a[i-1]){
            dp[i][1].second = max(dp[i][1].second, dp[i-1][0].second);
            dp[i][1].first = min(dp[i][1].first, dp[i-1][0].first);
        }
        if(b[i] >= b[i-1]){
            dp[i][1].second = max(dp[i][1].second, dp[i-1][1].second);
            dp[i][1].first = min(dp[i][1].first, dp[i-1][1].first);
        }
	}
	if(dp[2*n][1].second >= n && dp[2*n][1].first <= n){
        uradi(2*n, 1, n);
        cout << res;
        return 0;
	}
	if(dp[2*n][0].second >= n && dp[2*n][0].first <= n){
        uradi(2*n, 0, n-1);
        cout << res;
        return 0;
	}
	cout << -1;
    return 0;
}
/*
1
1 2
1 2
*/
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...