제출 #906185

#제출 시각아이디문제언어결과실행 시간메모리
906185alexdd건물 4 (JOI20_building4)C++17
100 / 100
186 ms43576 KiB
#include<bits/stdc++.h> using namespace std; const int INF = 2e9; int n; int a[1000005]; int b[1000005]; pair<int,int> dp[1000005][2]; pair<int,int> combine(pair<int,int> x, pair<int,int> y) { return {min(x.first,y.first), max(x.second,y.second)}; } signed main() { ios_base::sync_with_stdio(0);cin.tie(0); cin>>n; for(int i=1;i<=2*n;i++) cin>>a[i]; for(int i=1;i<=2*n;i++) cin>>b[i]; dp[1][0] = {1,1}; dp[1][1] = {0,0}; for(int i=2;i<=2*n;i++) { dp[i][0] = {n+1,0}; dp[i][1] = {n+1,0}; if(a[i]>=a[i-1]) { dp[i][0] = combine(dp[i][0], {dp[i-1][0].first+1, dp[i-1][0].second+1}); } if(a[i]>=b[i-1]) { dp[i][0] = combine(dp[i][0], {dp[i-1][1].first+1, dp[i-1][1].second+1}); } if(b[i]>=a[i-1]) { dp[i][1] = combine(dp[i][1], dp[i-1][0]); } if(b[i]>=b[i-1]) { dp[i][1] = combine(dp[i][1], dp[i-1][1]); } } if((dp[2*n][0].first<=n && dp[2*n][0].second>=n) || (dp[2*n][1].first<=n && dp[2*n][1].second>=n)) { int cur = n, ult = INF; string s = ""; for(int i=2*n;i>0;i--) { if(dp[i][0].first<=cur && dp[i][0].second>=cur && a[i] <= ult) { ult = a[i]; s.push_back('A'); cur--; } else { ult = b[i]; s.push_back('B'); } } reverse(s.begin(),s.end()); cout<<s; } else cout<<-1; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...