Submission #810614

#TimeUsernameProblemLanguageResultExecution timeMemory
810614vjudge1Building 4 (JOI20_building4)C++14
100 / 100
272 ms31584 KiB
#include<bits/stdc++.h> #define fi first #define se second #define ll long long using namespace std ; const int N = 5e5 ; int n, a[2 * N + 1], b[2 * N + 1] ; pair<int, int> dp[2 * N + 1][2] ; vector<char> ans ; pair<int, int> mrg(pair<int, int> p1, pair<int, int> p2) { if(p1.fi >= 1e9) return p2 ; if(p2.fi >= 1e9) return p1 ; return {min(p1.fi, p2.fi), max(p1.se, p2.se)} ; } signed main() { ios_base::sync_with_stdio( 0 ) ; cin.tie( 0 ) ; cout.tie( 0 ) ; cin >> n ; n *= 2 ; for(int i = 1 ; i <= n ; i++) cin >> a[i] ; for(int i = 1 ; i <= n ; i++) cin >> b[i] ; for(int i = 1 ; i <= n ; i++) dp[i][0] = dp[i][1] = {1e9, 1e9} ; dp[0][0] = {0, 0} ; dp[1][0] = {0, 0} ; dp[1][1] = {1, 1} ; for(int i = 2 ; i <= n ; i++) { if(a[i - 1] <= b[i]) dp[i][1] = {dp[i - 1][0].fi + 1, dp[i - 1][0].se + 1} ; if(b[i - 1] <= b[i]) dp[i][1] = mrg({dp[i - 1][1].fi + 1, dp[i - 1][1].se + 1}, dp[i][1]) ; if(a[i - 1] <= a[i]) dp[i][0] = {dp[i - 1][0].fi, dp[i - 1][0].se} ; if(b[i - 1] <= a[i]) dp[i][0] = mrg(dp[i - 1][1], dp[i][0]) ; } // for(int i = 1 ; i <= n ; i++) // { // cout << dp[i][0].fi << ' ' << dp[i][0].se << '\n' ; // cout << dp[i][1].fi << ' ' << dp[i][1].se << '\n' ; // } // cout << "\n" ; if((dp[n][0].fi > n / 2 || n / 2 > dp[n][0].se) && (dp[n][1].fi > n / 2 || dp[n][1].se < n / 2)) { cout << "-1\n" ; return 0 ; } pair<int, bool> now = {n / 2, 0} ; if(dp[n][1].fi <= n / 2 && n / 2 <= dp[n][1].se) now = {n / 2, 1} ; for(int i = n - 1 ; i >= 0 ; i--) if(!now.se) { ans.push_back('A') ; if(a[i] <= a[i + 1] && dp[i][0].fi <= now.fi && now.fi <= dp[i][0].se) { now = {now.fi, 0} ; continue ; } if(b[i] <= a[i + 1] && dp[i][1].fi <= now.fi && now.fi <= dp[i][1].se) { now = {now.fi, 1} ; continue ; } } else { ans.push_back('B') ; if(a[i] <= b[i + 1] && dp[i][0].fi <= now.fi - 1 && now.fi - 1 <= dp[i][0].se) { now = {now.fi - 1, 0} ; continue ; } if(b[i] <= b[i + 1] && dp[i][1].fi <= now.fi - 1 && now.fi - 1 <= dp[i][1].se) { now = {now.fi - 1, 1} ; continue ; } } reverse(ans.begin(), ans.end()) ; for(char i : ans) cout << i ; return 0 ; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...