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 <bits/stdc++.h>
using namespace std;
#define F first
#define S second
#define int long long
pair<int, int> uni(pair<int, int> p1, pair<int, int> p2){
return {min(p1.F, p2.F), max(p1.S, p2.S)};
}
const int N =1e6+3;
int a[N], b[N];
pair<int, int> dp[N][2];
signed main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
int n;
cin >> n;
n<<=1;
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++){
dp[i][0]=dp[i][1]={2e9, -2e9};
if(a[i]>=a[i-1] && a[i]>=b[i-1]){
dp[i][0]=uni(dp[i-1][0], dp[i-1][1]);
}
else if(a[i]>=a[i-1]){
dp[i][0]=dp[i-1][0];
}
else if(a[i]>=b[i]){
dp[i][0]=dp[i-1][1];
}
dp[i][0].F++;
dp[i][0].S++;
if(b[i]>=a[i-1] && b[i]>=b[i-1]){
dp[i][1]=uni(dp[i-1][0], dp[i-1][1]);
}
else if(b[i]>=a[i-1])dp[i][1]=dp[i-1][0];
else if(b[i]>=b[i-1])dp[i][1]=dp[i-1][1];
if(dp[i][0].F>=2e9 && dp[i][1].F>=2e9){
cout << -1 << '\n';
return 0;
}
}
pair<int, int> ans;
bool let=0;
string cons="";
int cnt=n/2;
if(dp[n-1][0].F<=n/2 && dp[n-1][0].S>=n/2){
ans=dp[n-1][0];
cnt--;
cons+='A';
}
else if(dp[n-1][1].F<=n/2 && dp[n-1][1].S>=n/2){
ans=dp[n-1][1];
let=1;
cons+='B';
}
else{
cout << -1 << '\n';
return 0;
}
for(int i=n-1; i>=1; i--){
if(let)swap(a[i], b[i]);
if(a[i-1]<=a[i] && cnt && dp[i-1][0].F<=cnt && dp[i-1][0].S>=cnt){
if(let)swap(a[i], b[i]);
cons+='A';
let=0;
cnt--;
continue;
}
if(let)swap(a[i], b[i]);
cons+='B';
let=1;
}
reverse(cons.begin(), cons.end());
int prev=0;
for(int i = 0; i< n; i++){
if(cons[i]=='A'){
if(a[i]>=prev){
prev=a[i];
}
else prev=2e9;
}
else{
if(b[i]>=prev){
prev=b[i];
}
else prev=2e9;
}
}
if(prev==2e9){
cout << -1 << '\n';
return 0;
}
assert(cnt==0);
cout << cons << '\n';
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |