# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
211603 | mieszko11b | 건물 4 (JOI20_building4) | C++14 | 433 ms | 24184 KiB |
이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <bits/stdc++.h>
using namespace std;
using ii = pair<int, int>;
#define X first
#define Y second
int n;
ii dp[500007][2];
int a[500007], b[500007];
ii merge(ii a, ii b) {
return {min(a.X, b.X), max(a.Y, b.Y)};
}
ii addone(ii a) {
return {a.X + 1, a.Y + 1};
}
int main() {
scanf("%d", &n);
n *= 2;
for(int i = 1 ; i <= n ; i++)
scanf("%d", &a[i]);
for(int i = 1 ; i <= n ; i++)
scanf("%d", &b[i]);
dp[1][0] = {1, 1};
dp[1][1] = {0, 0};
for(int i = 2 ; i <= n ; i++) {
dp[i][0] = dp[i][1] = {1e9, -1e9};
if(a[i] >= a[i - 1])
dp[i][0] = merge(dp[i][0], addone(dp[i - 1][0]));
if(a[i] >= b[i - 1])
dp[i][0] = merge(dp[i][0], addone(dp[i - 1][1]));
if(b[i] >= a[i - 1])
dp[i][1] = merge(dp[i][1], dp[i - 1][0]);
if(b[i] >= b[i - 1])
dp[i][1] = merge(dp[i][1], dp[i - 1][1]);
}
string res;
int ac = 1;
if(!(dp[n][0].X <= n / 2 && n / 2 <= dp[n][0].Y)) ac = 2;
if(!(dp[n][0].X <= n / 2 && n / 2 <= dp[n][0].Y) && !(dp[n][1].X <= n / 2 && n / 2 <= dp[n][1].Y)) {
printf("-1\n");
return 0;
}
//~ cout << dp[n - 1][0].X << " "<< dp[n - 1][0].Y << endl;
res += (ac == 1 ? 'A' : 'B');
int c = n / 2;
for(int i = n ; i >= 2 ; i--) {
//~ cout << n << " " << c << endl;
int aac = 1;
if(ac == 1)
c--;
if(!(dp[i - 1][0].X <= c && c <= dp[i - 1][0].Y && ((ac == 1 && a[i] >= a[i - 1]) || (ac == 2 && b[i] >= a[i - 1]))))
aac = 2;
ac = aac;
res += (ac == 1 ? 'A' : 'B');
}
reverse(res.begin(), res.end());
printf("%s\n", res.c_str());
return 0;
}
컴파일 시 표준 에러 (stderr) 메시지
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |