제출 #1166999

#제출 시각아이디문제언어결과실행 시간메모리
1166999tvgk건물 4 (JOI20_building4)C++20
0 / 100
0 ms324 KiB
#include<bits/stdc++.h>
using namespace std;
#define task "a"
#define se second
#define fi first
#define ll long long
#define ii pair<ll, ll>
const long mxN = 5e5 + 7, inf = 1e9 + 7;

bool id[mxN];
int n, a[mxN][3], mx[mxN], mn[mxN], ans[mxN];
vector<ii> v;

int cvert(bool j)
{
    if (j == 1)
        return 1;
    return -1;
}

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
    //freopen(task".INP", "r", stdin);
    //freopen(task".OUT", "w", stdout);

    cin >> n;
    n *= 2;
    for (int i = 0; i <= 1; i++)
    {
        for (int j = 1; j <= n; j++)
        {
            cin >> a[j][i];
            ans[j] = -1;
            id[j] = a[j][1] >= a[j][0];
        }
    }
    a[n + 1][0] = a[n + 1][1] = inf;

    int sum = 0;
    for (int i = n - 1; i > 0; i--)
    {
        if (a[i][id[i]] > a[i + 1][id[i + 1]])
        {
            id[i] = ans[i] = id[i] ^ 1;
            sum += cvert(ans[i]);
        }
    }

    int l = 1;
    for (int i = 1; i <= n; i++)
    {
        if (min(a[i][0], a[i][1]) > max(a[i][0], a[i][1]))
        {
            cout << -1;
            return 0;
        }

        if (ans[i] != -1)
        {
            if (l < i)
                v.push_back({l, i - 1});
            l = i + 1;
        }
        if (a[i][id[i]] <= min(a[i + 1][0], a[i + 1][1]))
        {
            if (l <= i)
                v.push_back({l, i});
            l = i + 1;
        }
    }

    for (int j = 1; j <= v.size(); j++)
    {
        int cur = 0;
        for (int i = v[j - 1].fi; i <= v[j - 1].se; i++)
            cur -= cvert(id[i]);

        mn[j] = mx[j] = cur;
        for (int i = v[j - 1].fi; i <= v[j - 1].se; i++)
        {
            id[i] ^= 1;
            if (a[i - 1][id[i - 1]] > a[i][id[i]])
                break;

            cur -= 2 * cvert(id[i]);
            mn[j] = min(mn[j], cur);
            mx[j] = max(mx[j], cur);
        }
        mn[j] += mn[j - 1];
        mx[j] += mx[j - 1];
    }

    if (sum < mn[v.size()] || mx[v.size()] < sum)
    {
        cout << -1;
        return 0;
    }

    for (int j = v.size() - 1; j >= 0; j--)
    {
        for (int i = v[j].fi; i <= v[j].se; i++)
        {
            ans[i] = a[i][1] >= a[i][0];
            sum += cvert(ans[i]);
        }

        for (int i = v[j].fi; i <= v[j].se; i++)
        {
            if (mn[j] <= sum && sum <= mx[j])
                break;

            ans[i] ^= 1;
            sum += 2 * cvert(ans[i]);
        }
    }

    for (int i = 1; i <= n; i++)
        cout << char('A' + ans[i]);
}

#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...