Submission #1325891

#TimeUsernameProblemLanguageResultExecution timeMemory
1325891sh_qaxxorov_571Building 4 (JOI20_building4)C++20
100 / 100
266 ms119960 KiB
#include <iostream> #include <vector> #include <string> #include <algorithm> using namespace std; const int INF = 1e9; int main() { ios::sync_with_stdio(false); cin.tie(0); int n; cin >> n; int len = 2 * n; vector<int> a(len), b(len); for (int i = 0; i < len; i++) cin >> a[i]; for (int i = 0; i < len; i++) cin >> b[i]; // dpMin[i][0] - i-binoda 'A' tanlansa, hozirgacha tanlangan 'A'larning min soni // dpMax[i][0] - i-binoda 'A' tanlansa, hozirgacha tanlangan 'A'larning max soni // [i][1] esa 'B' tanlangan holat uchun vector<vector<int>> dpMin(len, vector<int>(2, INF)); vector<vector<int>> dpMax(len, vector<int>(2, -INF)); // Boshlang'ich holat dpMin[0][0] = dpMax[0][0] = 1; dpMin[0][1] = dpMax[0][1] = 0; for (int i = 1; i < len; i++) { // Hozir 'A' tanlasak (a[i]) if (a[i] >= a[i-1]) { dpMin[i][0] = min(dpMin[i][0], dpMin[i-1][0] + 1); dpMax[i][0] = max(dpMax[i][0], dpMax[i-1][0] + 1); } if (a[i] >= b[i-1]) { dpMin[i][0] = min(dpMin[i][0], dpMin[i-1][1] + 1); dpMax[i][0] = max(dpMax[i][0], dpMax[i-1][1] + 1); } // Hozir 'B' tanlasak (b[i]) if (b[i] >= a[i-1]) { dpMin[i][1] = min(dpMin[i][1], dpMin[i-1][0]); dpMax[i][1] = max(dpMax[i][1], dpMax[i-1][0]); } if (b[i] >= b[i-1]) { dpMin[i][1] = min(dpMin[i][1], dpMin[i-1][1]); dpMax[i][1] = max(dpMax[i][1], dpMax[i-1][1]); } } // Natijani tiklash (Backtracking) int currentA; int lastVal = 2e9; // Juda katta son string res = ""; if (n >= dpMin[len-1][0] && n <= dpMax[len-1][0]) currentA = 0; else if (n >= dpMin[len-1][1] && n <= dpMax[len-1][1]) currentA = 1; else { cout << -1 << endl; return 0; } int remainingN = n; for (int i = len - 1; i >= 0; i--) { if (currentA == 0) { res += 'A'; remainingN--; lastVal = a[i]; } else { res += 'B'; lastVal = b[i]; } if (i > 0) { // Avvalgi qadamda qaysi biri to'g'ri kelishini tekshiramiz if (a[i-1] <= lastVal && remainingN >= dpMin[i-1][0] && remainingN <= dpMax[i-1][0]) { currentA = 0; } else { currentA = 1; } } } reverse(res.begin(), res.end()); cout << res << endl; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...