Submission #1291243

#TimeUsernameProblemLanguageResultExecution timeMemory
1291243haha건물 4 (JOI20_building4)C++20
100 / 100
159 ms26028 KiB
#include <bits/stdc++.h>
using namespace std;
#define f first
#define s second
#define ll long long
const int maxn=1e6+5;
const ll MOD=1e9+7;
const int base=31;

int n;
int a[maxn],b[maxn];
pair<int,int> dp[maxn][2];
// 0 A
// 1 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];
    dp[0][0]={0,0};
    dp[0][1]={0,0};
    for(int i=1;i<=2*n;i++){
        dp[i][0]={1e9,0};
        dp[i][1]={1e9,0};
        if(a[i]>=a[i-1]){
            dp[i][0].f=min(dp[i][0].f,dp[i-1][0].f+1);
            dp[i][0].s=max(dp[i][0].s,dp[i-1][0].s+1);
        }
        if(a[i]>=b[i-1]){
            dp[i][0].f=min(dp[i][0].f,dp[i-1][1].f+1);
            dp[i][0].s=max(dp[i][0].s,dp[i-1][1].s+1);
        }
        if(b[i]>=b[i-1]){
            dp[i][1].f=min(dp[i][1].f,dp[i-1][1].f);
            dp[i][1].s=max(dp[i][1].s,dp[i-1][1].s);
        }
        if(b[i]>=a[i-1]){
            dp[i][1].f=min(dp[i][1].f,dp[i-1][0].f);
            dp[i][1].s=max(dp[i][1].s,dp[i-1][0].s);
        }
    }
    bool check=false;
    int lst;
    if(dp[2*n][0].f<=n&&n<=dp[2*n][0].s){
        check=true;
        lst=0;
    }
    if(dp[2*n][1].f<=n&&n<=dp[2*n][1].s){
        check=true;
        lst=1;
    }
    if(!check){
        cout<<-1;
        return 0;
    }
    int cnt=n;
    string ans;
    for(int i=2*n;i>=1;i--){
        if(lst==0){
            ans+='A';
            cnt--;
        }
        else ans+='B';
        int prev=-1;
        if(lst==0){
            if(a[i]>=a[i-1]&&dp[i-1][0].f<=cnt&&cnt<=dp[i-1][0].s) prev=0;
            else if(a[i]>=b[i-1]&&dp[i-1][1].f<=cnt&&cnt<=dp[i-1][1].s) prev=1;
        }
        else{
            if(b[i]>=a[i-1]&&dp[i-1][0].f<=cnt&&cnt<=dp[i-1][0].s) prev=0;
            else if(b[i]>=b[i-1]&&dp[i-1][1].f<=cnt&&cnt<=dp[i-1][1].s) prev=1;
        }
        if(prev==-1){
            cout<<-1;
            return 0;
        }
        lst=prev;
    }
    reverse(ans.begin(),ans.end());
    cout<<ans;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...