Submission #1000355

#TimeUsernameProblemLanguageResultExecution timeMemory
1000355MarwenElarbiBuilding 4 (JOI20_building4)C++17
100 / 100
515 ms45384 KiB
#include <bits/stdc++.h>
using namespace std;
#define fi first
#define se second
#define ll long long
#define pb push_back
#define ii pair<int,int>
const int nax=1e6+5;
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
int dp[2][nax][2];
int tab[2][nax];
int main() {
    int n;
    cin>>n;
    n*=2;
    for (int i = 0; i < 2; ++i)
    {
        for (int j = 1; j <= n; ++j)
        {
            cin>>tab[i][j];
        }
    }
    for (int i = 1; i <= n; ++i)
    {
        for (int j = 0; j < 2; ++j)
        {
            dp[j][i][0]=n+1;
            dp[j][i][1]=-1;
            for (int k = 0; k < 2; ++k)
            {
                if(tab[j][i]>=tab[k][i-1]){
                    dp[j][i][0]=min(dp[j][i][0],dp[k][i-1][0]+j);
                    dp[j][i][1]=max(dp[j][i][1],dp[k][i-1][1]+j);
                }
            }
        }
    }
    int lst=-1;
    for (int i = 0; i < 2; ++i)
    {
        if(dp[i][n][0]<=n/2&&n/2<=dp[i][n][1]){
            lst=i;
        }
    }
    if(lst<0){
        cout <<-1<<endl;
    }else{
        string ans="";
        int c=n/2;
        while(n){
            ans.pb(char('A'+lst));
            c-=lst;
            lst=(tab[1][n-1]<=tab[lst][n]&&dp[1][n-1][0]<=c&&c<=dp[1][n-1][1]);
            n--;
        }
        reverse(ans.begin(),ans.end());
        cout <<ans<<endl;
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...