제출 #926111

#제출 시각아이디문제언어결과실행 시간메모리
926111AlphaMale06건물 4 (JOI20_building4)C++14
0 / 100
5 ms8764 KiB
#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]; if(dp[i][0].F<0 && dp[i][1].F<0){ 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()); cout << cons << '\n'; int prev=0; for(int i = 0; i< n; i++){ if(cons[i]=='A'){ if(a[i]>=prev){ prev=a[i]; } else assert(0); } else{ if(b[i]>=prev){ prev=b[i]; } else assert(0); } } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...