Submission #626500

#TimeUsernameProblemLanguageResultExecution timeMemory
626500dxz05Building 4 (JOI20_building4)C++14
0 / 100
34 ms63096 KiB
// #include <bits/stdc++.h> // // using namespace std; // using ll = long long; // // int p[4004][2002][2]; // // signed main() { // cin.tie(0)->sync_with_stdio(0); // // int n; // cin >> n; // // vector<int> arr[2]; // arr[0] = vector<int>(n*2); // for (int i = 0; i < n*2; i++) { // cin >> arr[0][i]; // } // for (int i = 0; i < n * 2; i++) { // cin >> arr[1][i]; // } // // int memo[n*2][n+1][2]; // int par[n*2][n+1][2]; // memset(memo, -1, sizeof(memo)); // // auto dp = [&](int i, int count, bool last) { // if (memo[i][count][last] !=-1) return memo[i][count][last]; // if (i == n*2) return count == n; // if (arr[last][i-1] <= arr[1][i] && dp(i+1, count, 1)) { // par[i][count][last] = 1; // return memo[i][count][last] = true; // } // if (arr[last][i-1] <= arr[0][i] && dp(i+1, count+1, 0)) { // par[i][count][last] = 2; // return memo[i][count][last] = true; // } // return memo[i][count][last] = false; // } // // dp( // // return 0; // } #include <bits/stdc++.h> using namespace std; int p[4004][2002][2]; signed main() { cin.tie(0)->sync_with_stdio(0); int n; cin >> n; memset(p, -1, sizeof(p)); vector<int> a(2*n), b(2*n); for (int &i : a) cin >> i; for (int &i : b) cin >> i; vector<vector<char>> dp(2, vector<char>(n + 1)); dp[0][1] = true; dp[1][0] = true; for (int i = 1; i < 2 * n; i++){ vector<vector<char>> ndp(2, vector<char>(n + 1)); for (int x = 0; x <= min(n, i + 1); x++){ // c[i] = a[i] if (x > 0){ if (dp[0][x - 1] && a[i - 1] <= a[i]){ ndp[0][x] = true; p[i][0][x] = 0; } if (dp[1][x - 1] && b[i - 1] <= a[i]){ ndp[0][x] = true; p[i][0][x] = 1; } } // c[i] = b[i]; if (dp[0][x] && a[i - 1] <= b[i]){ ndp[1][x] = true; p[i][1][x] = 0; } if (dp[1][x] && b[i - 1] <= b[i]){ ndp[1][x] = true; p[i][1][x] = 1; } } //for (int x = 0; x <= n; x++) cout << (int)ndp[0][x] << ' '; cout << endl; //for (int x = 0; x <= n; x++) cout << (int)ndp[1][x] << ' '; cout << endl << endl; dp = ndp; } if (!dp[0][n] && !dp[1][n]){ cout << "-1" << endl; return 0; } int i = 2 * n - 1; int j = (dp[0][n] ? 0 : 1); string s; while (i >= 0){ s.push_back('A' + (j != 0)); if (p[i][j][n] == 0){ if (j == 0) n--; j = 0; } else { if (j == 0) n--; j = 1; } i--; } reverse(s.begin(), s.end()); cout << s << endl; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...