#include <iostream>
#include <vector>
#include <algorithm>
#include <cassert>
using namespace std;
const int MAXN = 5e5 + 10;
const int INF = 1e9 + 10;
int n;
int a[2 * MAXN][2];
pair < int, int > dp[2 * MAXN][2];
void read()
{
cin >> n;
for(int x = 0; x < 2; x++)
{
for(int i = 1; i <= 2 * n; i++)
{
cin >> a[i][x];
}
}
}
void find_ans()
{
int curcnt = n;
int cur = -1;
if(dp[2 * n][0].first <= curcnt && curcnt <= dp[2 * n][0].second)
{
cur = 0;
}
if(dp[2 * n][1].first <= curcnt && curcnt <= dp[2 * n][1].second)
{
cur = 1;
}
if(cur == -1)
{
cout << -1 << endl;
return;
}
vector < int > ans;
for(int i = 2 * n; i >= 1; i--)
{
ans.push_back(cur);
curcnt -= cur;
int prv = -1;
for(int y = 0; y < 2; y++)
{
if(a[i - 1][y] <= a[i][cur] && dp[i - 1][y].first <= curcnt && curcnt <= dp[i - 1][y].second)
{
prv = y;
}
}
assert(prv != -1);
cur = prv;
}
reverse(ans.begin(), ans.end());
for(int x : ans)
{
cout << (char)(x + 'A');
}
cout << endl;
}
void solve()
{
dp[0][0] = dp[0][1] = {0, 0};
for(int i = 1; i <= 2 * n; i++)
{
dp[i][0] = dp[i][1] = {INF, 0};
for(int x = 0; x < 2; x++)
{
for(int y = 0; y < 2; y++)
{
if(a[i - 1][y] <= a[i][x])
{
dp[i][x].first = min(dp[i][x].first, dp[i - 1][y].first + x);
dp[i][x].second = max(dp[i][x].second, dp[i - 1][y].second + x);
}
}
}
}
}
int main()
{
read();
solve();
find_ans();
return 0;
}
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |