Submission #1193673

#TimeUsernameProblemLanguageResultExecution timeMemory
1193673NewtonabcBuilding 4 (JOI20_building4)C++20
100 / 100
512 ms25992 KiB
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10;
//dp[i][j]=keep range of possible a in the state that iterate from 1 to i and pick i at a/b (0/1)
pair<int,int> dp[N][2];
int a[N],b[N];
void upd(pair<int,int> &a,pair<int,int> b,int add){
    if(b.first==INT_MAX) add=0;
    a={min(a.first,b.first+add),max(a.second,b.second+add)};
}
int main(){
    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=2;i<=2*n;i++) dp[i][0]=dp[i][1]={INT_MAX,INT_MIN};
    dp[1][0]={1,1},dp[1][1]={0,0};
    for(int i=2;i<=2*n;i++){
        if(a[i]>=a[i-1]) upd(dp[i][0],dp[i-1][0],1);
        if(a[i]>=b[i-1]) upd(dp[i][0],dp[i-1][1],1);
        if(b[i]>=a[i-1]) upd(dp[i][1],dp[i-1][0],0);
        if(b[i]>=b[i-1]) upd(dp[i][1],dp[i-1][1],0);
        //cout<<dp[i][0].first <<" " <<dp[i][0].second <<"," <<dp[i][1].first <<" " <<dp[i][1].second <<"\n";
    }
    int use=n,now=INT_MAX;
    vector<char> v;
    for(int i=2*n;i>=1;i--){
        if((dp[i][0].first<=use && use<=dp[i][0].second) && now>=a[i]){
            use--;
            now=a[i];
            v.push_back('A');
            //cout<<'a' <<" ";
        }
        else if((dp[i][1].first<=use && use<=dp[i][1].second) && now>=b[i]){
            v.push_back('B');
            now=b[i];
            //cout<<'b' <<" ";
        }
        else{
          if(i!=2*n){
            return 0;
          }
            cout<<-1;
            return 0;
        }
    }
    reverse(v.begin(),v.end());
    for(auto c:v){
        cout<<c;
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...