이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#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]={-1e9, -1e9};
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];
}
pair<int, int> ans={-1, -1};
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-2; i>=0; i--){
if(let)swap(a[i+1], b[i+1]);
if(a[i+1]>=a[i] && dp[i][0].F<=cnt && dp[i][0].S>=cnt){
cnt--;
let=0;
cons+='A';
continue;
}
let=1;
cons+='B';
}
reverse(cons.begin(), cons.end());
cout << cons << '\n';
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |