Submission #596817

#TimeUsernameProblemLanguageResultExecution timeMemory
596817penguinhackerBuilding 4 (JOI20_building4)C++17
100 / 100
281 ms45388 KiB
#include <bits/stdc++.h> using namespace std; #define ll long long #define ar array const int mxN=5e5; int n, a[2*mxN][2], dp[2*mxN][2][2]; // take a, b, max a, max b int main() { ios::sync_with_stdio(0); cin.tie(0); cin >> n; for (int j : {0, 1}) for (int i=0; i<2*n; ++i) cin >> a[i][j]; memset(dp, -1, sizeof(dp)); dp[0][0][0]=1, dp[0][0][1]=0, dp[0][1][1]=1, dp[0][1][0]=0; for (int i=1; i<2*n; ++i) { for (int j : {0, 1}) { for (int k : {0, 1}) { if (a[i-1][k]<=a[i][j]&&dp[i-1][k][0]!=-1) { dp[i][j][0]=max(dp[i][j][0], dp[i-1][k][0]+(j==0)); dp[i][j][1]=max(dp[i][j][1], dp[i-1][k][1]+(j==1)); } } } } for (int x : {0, 1}) { if (dp[2*n-1][x][0]>=n&&dp[2*n-1][x][1]>=n) { string ans(2*n, 'A'); int need[2]={n, n}; for (int i=2*n-1, j=x; ~i; --i) { ans[i]='A'+j; --need[j]; if (i) { bool ok=0; for (int k : {0, 1}) if (a[i-1][k]<=a[i][j]&&dp[i-1][k][0]>=need[0]&&dp[i-1][k][1]>=need[1]) { j=k; ok=1; break; } assert(ok); } } cout << ans; return 0; } } cout << -1; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...