Submission #1097249

#TimeUsernameProblemLanguageResultExecution timeMemory
1097249MrPavlitoBuilding 4 (JOI20_building4)C++17
100 / 100
238 ms108236 KiB
#include <bits/stdc++.h>
#define int long long
#define pb push_back
#define mp make_pair
#define all(x) (x).begin(),(x).end()
#define fi first
#define sc second
#define endl "\n"
#define pii pair<int,int>

using namespace std;

const int MAXN = 5e5+5;
const int mod7 = 1e9+7;
const long long inf = 1e18;

int n;
vector<vector<pii>> dp(MAXN*2, vector<pii>(2, {inf,-inf}));

bool check(pii p, int c)
{
    if(p.fi <= c && p.sc >=c)return 1;
    return 0;
}

signed main()
{
    ios_base::sync_with_stdio(false),cin.tie(0), cout.tie(0);
    int tt=1;
    //cin >> tt;
    while(tt--)
    {
        cin >> n;
        n<<=1;
        vector<int>a(n);
        vector<int>b(n);
        for(int i=0; i<n; i++)cin >> a[i];
        for(int i=0; i<n; i++)cin >> b[i];
        dp[0][0] = {1,1};
        dp[0][1] = {0,0};

        for(int i=1; i<n; i++)
        {
            ///gornji deo
            if(b[i-1] <= a[i])
            {
                dp[i][0].fi = min(dp[i][0].fi, dp[i-1][1].fi + 1);
                dp[i][0].sc = max(dp[i][0].sc, dp[i-1][1].sc + 1);
            }
            if(a[i-1] <= a[i])
            {
                dp[i][0].fi = min(dp[i][0].fi, dp[i-1][0].fi + 1);
                dp[i][0].sc = max(dp[i][0].sc, dp[i-1][0].sc + 1);
            }
            /// donji deo
            if(b[i-1] <= b[i])
            {
                dp[i][1].fi = min(dp[i][1].fi, dp[i-1][1].fi);
                dp[i][1].sc = max(dp[i][1].sc, dp[i-1][1].sc);
            }
            if(a[i-1] <= b[i])
            {
                dp[i][1].fi = min(dp[i][1].fi, dp[i-1][0].fi);
                dp[i][1].sc = max(dp[i][1].sc, dp[i-1][0].sc);
            }
        }
        //for(int i=0; i<n; i++)cout << dp[i][0].fi << ":" << dp[i][0].sc << "  ";cout << endl;
        //for(int i=0; i<n; i++)cout << dp[i][1].fi << ":" << dp[i][1].sc << "  ";cout << endl;
        if(!(check(dp[n-1][0], n/2) || check(dp[n-1][1], n/2) ))cout << -1 << endl;
        else
        {
            vector<char> rez;
            int i = n-1;
            int j = 0;
            if(!check(dp[n-1][0], n/2))j = 1;
            int cnt = n/2;
            while(i>=0)
            {
                rez.pb('A' + j);
                cnt -= (1-j);
                if(i ==0)break;
                if(j == 0)
                {
                    if(check(dp[i-1][0], cnt) && a[i] >= a[i-1]) j = 0;
                    else if(check(dp[i-1][1], cnt)&& a[i] >= b[i-1]) j = 1;
                    else
                    {
                        cout << -1 << endl;
                        return 0;
                    }
                }
                else
                {
                    if(check(dp[i-1][0], cnt) && b[i] >= a[i-1]) j = 0;
                    else if(check(dp[i-1][1], cnt)&& b[i] >= b[i-1]) j = 1;
                    else
                    {
                        cout << -1 << endl;
                        return 0;
                    }
                }

                i--;
            }
            reverse(all(rez));
            for(auto x: rez)cout << x;cout << endl;
        }


    }
}

Compilation message (stderr)

building4.cpp: In function 'int main()':
building4.cpp:106:13: warning: this 'for' clause does not guard... [-Wmisleading-indentation]
  106 |             for(auto x: rez)cout << x;cout << endl;
      |             ^~~
building4.cpp:106:39: note: ...this statement, but the latter is misleadingly indented as if it were guarded by the 'for'
  106 |             for(auto x: rez)cout << x;cout << endl;
      |                                       ^~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...