제출 #1135861

#제출 시각아이디문제언어결과실행 시간메모리
1135861daoquanglinh2007건물 4 (JOI20_building4)C++20
100 / 100
167 ms56236 KiB
#include <bits/stdc++.h> using namespace std; const int NM = 1e6, inf = 1e9+7; int n, a[NM+5], b[NM+5]; int f[NM+5][2], g[NM+5][2]; void trace(int i, int j, int cur){ if (i == 0) return; if (j == 0){ if (a[i-1] <= a[i] && f[i-1][0] <= cur && g[i-1][0] >= cur) trace(i-1, 0, cur); else trace(i-1, 1, cur); cout << 'A'; } else{ cur--; if (a[i-1] <= b[i] && f[i-1][0] <= cur && g[i-1][0] >= cur) trace(i-1, 0, cur); else trace(i-1, 1, cur); cout << 'B'; } } int main(){ ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin >> n; for (int i = 1; i <= 2*n; i++) cin >> a[i]; for (int i = 1; i <= 2*n; i++) cin >> b[i]; for (int i = 1; i <= 2*n; i++){ f[i][0] = f[i][1] = +inf; g[i][0] = g[i][1] = -inf; } for (int i = 0; i <= 2*n; i++){ if (a[i] <= a[i+1]){ f[i+1][0] = min(f[i+1][0], f[i][0]); g[i+1][0] = max(g[i+1][0], g[i][0]); } if (a[i] <= b[i+1]){ f[i+1][1] = min(f[i+1][1], f[i][0]+1); g[i+1][1] = max(g[i+1][1], g[i][0]+1); } if (b[i] <= a[i+1]){ f[i+1][0] = min(f[i+1][0], f[i][1]); g[i+1][0] = max(g[i+1][0], g[i][1]); } if (b[i] <= b[i+1]){ f[i+1][1] = min(f[i+1][1], f[i][1]+1); g[i+1][1] = max(g[i+1][1], g[i][1]+1); } } if (f[2*n][0] <= n && g[2*n][0] >= n){ trace(2*n, 0, n); return 0; } if (f[2*n][1] <= n && g[2*n][1] >= n){ trace(2*n, 1, n); return 0; } cout << -1; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...