Submission #226768

#TimeUsernameProblemLanguageResultExecution timeMemory
226768MKopchevBuilding 4 (JOI20_building4)C++14
100 / 100
471 ms45544 KiB
#include<bits/stdc++.h>
using namespace std;
const int nmax=5e5+42;

int n;
int a[2*nmax],b[2*nmax];

string current;

pair<int,int> dp[2*nmax][2];

pair<int,int> my_merge(pair<int,int> u,pair<int,int> v)
{
    //cout<<"my_merge "<<u.first<<" "<<u.second<<" "<<v.first<<" "<<v.second<<endl;

    if(u.first>u.second)return v;
    if(v.first>v.second)return u;

    return {min(u.first,v.first),max(u.second,v.second)};
}

bool inside(pair<int,int> cur,int val)
{
    return cur.first<=val&&val<=cur.second;
}
int main()
{
    scanf("%i",&n);

    for(int i=1;i<=2*n;i++)scanf("%i",&a[i]);
    for(int i=1;i<=2*n;i++)scanf("%i",&b[i]);

    for(int pos=0;pos<=2*n;pos++)
        for(int side=0;side<2;side++)
            dp[pos][side]={1,0};

    dp[0][0]={0,0};

    for(int pos=1;pos<=2*n;pos++)
        for(int side=0;side<2;side++)
        {
            if(side==0)
            {
                if(a[pos-1]<=a[pos])dp[pos][side]=my_merge(dp[pos][side],dp[pos-1][0]);
                if(b[pos-1]<=a[pos])dp[pos][side]=my_merge(dp[pos][side],dp[pos-1][1]);

                if(dp[pos][side].first<=dp[pos][side].second)dp[pos][side].first++,dp[pos][side].second++;
            }
            else
            {
                if(a[pos-1]<=b[pos])dp[pos][side]=my_merge(dp[pos][side],dp[pos-1][0]);
                if(b[pos-1]<=b[pos])dp[pos][side]=my_merge(dp[pos][side],dp[pos-1][1]);
            }

            dp[pos][side].second=min(dp[pos][side].second,n);

            dp[pos][side].first=max(dp[pos][side].first,pos-n);

            //cout<<pos<<" "<<side<<" -> "<<dp[pos][side].first<<" "<<dp[pos][side].second<<endl;
        }

    int pos=2*n,a_now=n,side=0;

    if(dp[2*n][0].first<=dp[2*n][0].second);
    else if(dp[2*n][1].first<=dp[2*n][1].second)side=1;
    else {printf("-1\n");return 0;}

    while(pos)
    {
        current.push_back('A'+side);

        if(side==0)
        {
            a_now--;

            if(a[pos-1]<=a[pos]&&inside(dp[pos-1][0],a_now))side=0;
            else side=1;
        }
        else
        {
            if(a[pos-1]<=b[pos]&&inside(dp[pos-1][0],a_now))side=0;
            else side=1;
        }
        pos--;
    }

    reverse(current.begin(),current.end());

    for(int i=0;i<2*n;i++)
        printf("%c",current[i]);
    printf("\n");
    return 0;
}

Compilation message (stderr)

building4.cpp: In function 'int main()':
building4.cpp:28:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     scanf("%i",&n);
     ~~~~~^~~~~~~~~
building4.cpp:30:33: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     for(int i=1;i<=2*n;i++)scanf("%i",&a[i]);
                            ~~~~~^~~~~~~~~~~~
building4.cpp:31:33: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     for(int i=1;i<=2*n;i++)scanf("%i",&b[i]);
                            ~~~~~^~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...