Submission #1186648

#TimeUsernameProblemLanguageResultExecution timeMemory
1186648NAMINBuilding 4 (JOI20_building4)C++20
100 / 100
563 ms71864 KiB
#include <bits/stdc++.h> using namespace std; const int mxN = 500001; int N; int dp[2*mxN][2][2]; vector<int> A,B; //dp[i][j][k] = max(#times reach k ending at (i,j)) void calc(int i,int j,int cntA,int cntB){ //cout << cntA << ' ' << cntB << endl; if(i == 0){ if(j == 0) cout << 'A'; else cout << 'B'; return; } if(j == 0){ if(A[i-1] <= A[i] && dp[i-1][0][0] >= cntA-1 && dp[i-1][0][1] >= cntB){ calc(i-1,0,cntA-1,cntB); } else if(B[i-1] <= A[i] && dp[i-1][1][0] >= cntA-1 && dp[i-1][1][1] >= cntB){ calc(i-1,1,cntA-1,cntB); } } else{//j == 1 if(A[i-1] <= B[i] && dp[i-1][0][0] >= cntA && dp[i-1][0][1] >= cntB-1){ calc(i-1,0,cntA,cntB-1); } else if(B[i-1] <= B[i] && dp[i-1][1][0] >= cntA && dp[i-1][1][1] >= cntB-1){ calc(i-1,1,cntA,cntB-1); } } if(j == 0) cout << 'A'; else cout << 'B'; } int main(){ cin >> N; A.resize(2*N),B.resize(2*N); memset(dp,0,sizeof(dp)); for(int i=0;i<2*N;i++) cin >> A[i]; for(int i=0;i<2*N;i++) cin >> B[i]; dp[0][0][0] = 1; dp[0][1][1] = 1; for(int k=0;k<2;k++){ for(int i=1;i<2*N;i++){ for(int j=0;j<2;j++){ if(j == 0){ if(A[i] >= A[i-1]) dp[i][j][k] = max(dp[i][j][k], dp[i-1][j][k]+(j==k)); if(A[i] >= B[i-1]) dp[i][j][k] = max(dp[i][j][k], dp[i-1][!j][k]+(j==k)); } else{ if(B[i] >= A[i-1]) dp[i][j][k] = max(dp[i][j][k], dp[i-1][!j][k]+(j==k)); if(B[i] >= B[i-1]) dp[i][j][k] = max(dp[i][j][k], dp[i-1][j][k]+(j==k)); } } } } if(dp[2*N-1][0][0] >= N && dp[2*N-1][0][1] >= N){ calc(2*N-1,0,N,N); } else if(dp[2*N-1][1][0] >= N && dp[2*N-1][1][1] >= N){ calc(2*N-1,1,N,N); } else cout << -1; cout << endl; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...