# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
240670 | robertnovistan | 건물 4 (JOI20_building4) | C++14 | 451 ms | 16632 KiB |
이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <iostream>
#include <cstdio>
#include <bitset>
using namespace std;
const int MAX_BATIMENTS = (10 * 1000);
bitset <MAX_BATIMENTS> Accessibles[MAX_BATIMENTS][2];
int Luxures[MAX_BATIMENTS][2];
int nbBatiments;
void Read() {
scanf("%d", &nbBatiments);
nbBatiments *= 2;
for (int i = 0; i < 2; i ++)
{
for (int j = 0; j < nbBatiments; j ++)
{
scanf("%d", &Luxures[j][i]);
}
}
return;
}
void Treat(int ligne) {
//int b = ligne % 2;
//int a = (b + 1) % 2;
int b = ligne;
int a = ligne + 1;
Accessibles[b][0] &= ~ Accessibles[b][0];
Accessibles[b][1] &= ~ Accessibles[b][1];
if (Luxures[ligne][1] <= Luxures[ligne + 1][0])
{
Accessibles[b][1] |= Accessibles[a][0];
}
if (Luxures[ligne][1] <= Luxures[ligne + 1][1])
{
Accessibles[b][1] |= Accessibles[a][1];
}
if (Luxures[ligne][0] <= Luxures[ligne + 1][0])
{
Accessibles[b][0] |= (Accessibles[a][0] << 1);
}
if (Luxures[ligne][0] <= Luxures[ligne + 1][1])
{
Accessibles[b][0] |= (Accessibles[a][1] << 1);
}
return;
}
void Backtrack(int ligne, int id, int valeur) {
if (ligne >= nbBatiments - 1)
{
return;
}
if (id == 0)
{
valeur --;
}
if (valeur < 0)
{
printf("42");
return;
}
if (Luxures[ligne][id] <= Luxures[ligne + 1][0] && Accessibles[ligne + 1][0][valeur])
{
printf("A");
Backtrack(ligne + 1, 0, valeur);
}
else if (Luxures[ligne][id] <= Luxures[ligne + 1][1] && Accessibles[ligne + 1][1][valeur])
{
printf("B");
Backtrack(ligne + 1, 1, valeur);
}
return;
}
void Solve() {
//Accessibles[(nbBatiments - 1) % 2][0].set(1, 1);
//Accessibles[(nbBatiments - 1) % 2][1].set(0, 1);
Accessibles[nbBatiments - 1][0].set(1, 1);
Accessibles[nbBatiments - 1][1].set(0, 1);
for (int i = nbBatiments - 2; i >= 0; i --)
{
Treat(i);
}
if (!Accessibles[0][0][nbBatiments / 2] && !Accessibles[0][1][nbBatiments / 2])
{
printf("-1\n");
}
if (Accessibles[0][0][nbBatiments / 2])
{
printf("A");
Backtrack(0, 0, nbBatiments / 2);
}
else if (Accessibles[0][1][nbBatiments / 2])
{
printf("B");
Backtrack(0, 1, nbBatiments / 2);
}
printf("\n");
return;
for (int i = 0; i <= nbBatiments; i ++)
{
if (Accessibles[0][0][i])
{
printf("1");
}
else
{
printf("0");
}
}
printf("\n");
return;
}
int main() {
Read();
Solve();
return 0;
}
컴파일 시 표준 에러 (stderr) 메시지
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |