Submission #1291499

#TimeUsernameProblemLanguageResultExecution timeMemory
1291499NValchanovBuilding 4 (JOI20_building4)C++20
100 / 100
612 ms28908 KiB
#include <iostream> #include <vector> #include <algorithm> #include <cassert> using namespace std; const int MAXN = 5e5 + 10; const int INF = 1e9 + 10; int n; int a[2 * MAXN][2]; pair < int, int > dp[2 * MAXN][2]; void read() { cin >> n; for(int x = 0; x < 2; x++) { for(int i = 1; i <= 2 * n; i++) { cin >> a[i][x]; } } } void find_ans() { int curcnt = n; int cur = -1; if(dp[2 * n][0].first <= curcnt && curcnt <= dp[2 * n][0].second) { cur = 0; } if(dp[2 * n][1].first <= curcnt && curcnt <= dp[2 * n][1].second) { cur = 1; } if(cur == -1) { cout << -1 << endl; return; } vector < int > ans; for(int i = 2 * n; i >= 1; i--) { ans.push_back(cur); curcnt -= cur; int prv = -1; for(int y = 0; y < 2; y++) { if(a[i - 1][y] <= a[i][cur] && dp[i - 1][y].first <= curcnt && curcnt <= dp[i - 1][y].second) { prv = y; } } assert(prv != -1); cur = prv; } reverse(ans.begin(), ans.end()); for(int x : ans) { cout << (char)(x + 'A'); } cout << endl; } void solve() { dp[0][0] = dp[0][1] = {0, 0}; for(int i = 1; i <= 2 * n; i++) { dp[i][0] = dp[i][1] = {INF, 0}; for(int x = 0; x < 2; x++) { for(int y = 0; y < 2; y++) { if(a[i - 1][y] <= a[i][x]) { dp[i][x].first = min(dp[i][x].first, dp[i - 1][y].first + x); dp[i][x].second = max(dp[i][x].second, dp[i - 1][y].second + x); } } } } } int main() { read(); solve(); find_ans(); return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...