This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <iostream>
#include <complex>
#include <iomanip>
#include <vector>
#include <algorithm>
#include <functional>
#include <bitset>
#include <queue>
#include <map>
#include <stack>
#include <cmath>
#include <cstdint>
using namespace std;
#define endl '\n'
#define db double
#define ll __int128
#define int long long
#define pb push_back
#define fs first
#define sd second
#define Mod long(1e9 + 7)
#define all(x) x.begin(), x.end()
#define unvisited long(-1)
#define Eps double(1e-9)
#define _for(i, n) for(int i = 0; i < (n); i++)
#define dbg(x) cout << #x ": " << x << endl;
const int Max = 1e6 + 7, Inf = 1e9 + 7;
void print(bool x) { cout << (x ? "YES" : "NO") << endl; }
string tostring (__int128 x)
{
string ans = "";
while(x > 0)
{
ans += (x % 10 + '0');
x /= 10;
}
reverse(all(ans));
return ans;
}
pair <int, int> merge(pair<int, int> a, pair <int, int> b, int c){
return { min(a.fs, b.fs + c), max(a.sd, b.sd + c ) };
}
void solve()
{
int n; cin >> n;
vector <int> a(2*n), b(2*n);
for(auto& u : a) cin >> u;
for(auto& u : b) cin >> u;
vector <vector<pair<int, int>>> dp(2*n,
vector <pair<int, int>> (2, { Inf, -Inf}));
string ans = "";
dp[0][0] = { 1, 1 };
dp[0][1] = { 0, 0 };
_for(i, 2*n-1){
if(a[i] <= a[i+1]) dp[i+1][0] = merge(dp[i+1][0], dp[i][0], 1);
if(a[i] <= b[i+1]) dp[i+1][1] = merge(dp[i+1][1], dp[i][0], 0);
if(b[i] <= a[i+1]) dp[i+1][0] = merge(dp[i+1][0], dp[i][1], 1);
if(b[i] <= b[i+1]) dp[i+1][1] = merge(dp[i+1][1], dp[i][1], 0);
//cerr << i << " " << dp[i][0].fs << " " << dp[i][0].sd << " "
// << dp[i][1].fs << " " << dp[i][1].sd << endl;
}
int cnt = n, last = Inf;
for(int i = 2*n-1; i >= 0; i--)
{ //cerr << i << " " << dp[i][0].fs << " " << dp[i][0].sd << " "
// << dp[i][1].fs << " " << dp[i][1].sd << endl;
if(dp[i][0].fs <= cnt && cnt <= dp[i][0].sd && a[i] <= last){
ans += 'A'; last = a[i]; cnt--;
} else if(dp[i][1].fs <= cnt && cnt <= dp[i][1].sd && b[i] <= last){
ans += 'B'; last = b[i];
} else {
cout << -1 << endl;
return;
}
}
reverse(all(ans));
cout << ans << endl;
}
int32_t main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
int Q = 1; //cin >> Q;
while (Q--)
{
solve();
}
return 0;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |