Submission #211558

#TimeUsernameProblemLanguageResultExecution timeMemory
211558mcdx9524Building 4 (JOI20_building4)C++14
100 / 100
337 ms26152 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; mt19937 rnd(chrono::high_resolution_clock::now().time_since_epoch().count()); const int N = 5e5 + 7; const int inf = 1e9 + 7; pair <int, int> dp[2 * N][2]; int a[2 * N][2]; int main() { ios::sync_with_stdio(0); cin.tie(0); int n; cin >> n; n *= 2; for (int i = 0; i < n; i++) { cin >> a[i][0]; } for (int i = 0; i < n; i++) { cin >> a[i][1]; } for (int i = 0; i < n; i++) { for (int j = 0; j < 2; j++) { dp[i][j] = {inf, -1}; } } dp[0][0] = {1, 1}; dp[0][1] = {0, 0}; for (int i = 1; i < n; i++) { for (int me = 0; me < 2; me++) { for (int was = 0; was < 2; was++) { if (a[i - 1][was] > a[i][me]) { continue; } dp[i][me].first = min(dp[i][me].first, dp[i - 1][was].first + (me == 0)); dp[i][me].second = max(dp[i][me].second, dp[i - 1][was].second + (me == 0)); } } } int need = n / 2; string ans; if (dp[n - 1][0].first > need || dp[n - 1][0].second < need) { if (dp[n - 1][1].first > need || dp[n - 1][1].second < need) { cout << -1 << '\n'; return 0; } } int need_a = need, need_b = need; int last = inf; for (int i = n - 1; i >= 0; i--) { if (dp[i][0].first <= need_a && dp[i][0].second >= need_a && a[i][0] <= last) { ans += 'A'; need_a--; last = a[i][0]; } else { ans += 'B'; need_b--; last = a[i][1]; } } reverse(ans.begin(), ans.end()); cout << ans << '\n'; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...