제출 #212741

#제출 시각아이디문제언어결과실행 시간메모리
212741Alexa2001건물 4 (JOI20_building4)C++17
100 / 100
362 ms64376 KiB
#include <bits/stdc++.h> using namespace std; const int Nmax = 1e6 + 5; int A[Nmax], B[Nmax], s[Nmax][2], f[Nmax][2]; bool ok[Nmax][2]; char ans[Nmax]; int n; void min_to(int &x, int y) { if(x > y) x = y; } void max_to(int &x, int y) { if(x < y) x = y; } void solve(int i, int y, int z) { if(!z) ans[i] = 'A', y--; else ans[i] = 'B'; if(i == 1) { cout << (ans+1) << '\n'; return; } if(!z) { if(A[i] >= A[i-1] && ok[i-1][0] && s[i-1][0] <= y && y <= f[i-1][0]) solve(i-1, y, 0); else if(A[i] >= B[i-1] && ok[i-1][1] && s[i-1][1] <= y && y <= f[i-1][1]) solve(i-1, y, 1); else assert(0); return; } else { if(B[i] >= A[i-1] && ok[i-1][0] && s[i-1][0] <= y && y <= f[i-1][0]) solve(i-1, y, 0); else if(B[i] >= B[i-1] && ok[i-1][1] && s[i-1][1] <= y && y <= f[i-1][1]) solve(i-1, y, 1); else assert(0); return; } } int main() { // freopen("input", "r", stdin); cin.sync_with_stdio(false); cin.tie(0); int i; cin >> n; for(i=1; i<=2*n; ++i) cin >> A[i]; for(i=1; i<=2*n; ++i) cin >> B[i]; s[1][0] = f[1][0] = 1; s[1][1] = f[1][1] = 0; ok[1][0] = ok[1][1] = 1; for(i=2; i<=2*n; ++i) { s[i][0] = s[i][1] = 2*n+1; f[i][0] = f[i][1] = -1; if(A[i] >= A[i-1] && ok[i-1][0]) min_to(s[i][0], s[i-1][0] + 1), max_to(f[i][0], f[i-1][0] + 1); if(A[i] >= B[i-1] && ok[i-1][1]) min_to(s[i][0], s[i-1][1] + 1), max_to(f[i][0], f[i-1][1] + 1); if(B[i] >= A[i-1] && ok[i-1][0]) min_to(s[i][1], s[i-1][0]), max_to(f[i][1], f[i-1][0]); if(B[i] >= B[i-1] && ok[i-1][1]) min_to(s[i][1], s[i-1][1]), max_to(f[i][1], f[i-1][1]); ok[i][0] = (s[i][0] <= f[i][0]); ok[i][1] = (s[i][1] <= f[i][1]); } if(s[2*n][0] <= n && n <= f[2*n][0]) solve(2*n, n, 0); else if(s[2*n][1] <= n && n <= f[2*n][1]) solve(2*n, n, 1); else cout << "-1\n"; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...