| 시간 제한 | 메모리 제한 | 제출 | 정답 | 맞힌 사람 | 정답 비율 |
|---|---|---|---|---|---|
| 3 초 | 1024 MB | 74 | 8 | 7 | 50.000% |
이 문제는 투 스텝 인터랙티브 문제입니다.
브루와 민규는 서울과학고등학교에서 열리는 전략 서바이벌 게임 '더 챌린저스'에 팀으로 참가했다.
예선 게임은 두 팀원 중 한 명이 송신자, 다른 한 명이 수신자 역할을 맡아 게임을 진행한다. 게임이 진행되는 동안 두 팀원은 서로 다른 방에 들어가며 소통할 수 없다. 브루가 송신자, 민규가 수신자 역할을 맡는다.
게임의 딜러 동현은 먼저 브루의 방에 들어가 길이 $L$의 비트스트링 $S$('0'과 '1'로만 이루어진 문자열)를 제시한다. 이후 브루는 길이 $N$의 순열 $A$를 제출해야 한다. 동현은 브루가 제출한 순열을 다음과 같은 과정으로 섞는다.
예를 들어, 원래 순열 $A=[3,6,1,5,4,2]$이고, 피봇 $p=4$라면, 섞인 순열 $A'=[3,1,2,4,6,5]$가 된다. 이후 동현은 민규에게 순열 $A'$를 전달한다. 민규가 이 순열 $A'$를 보고 비트스트링 $S$를 정확히 맞힌다면 게임에서 승리한다.
민규가 운 좋게 비트스트링 $S$를 정확히 맞히는 것을 방지하기 위해, 동현은 초기에 브루에게 $T$개의 비트스트링을 제시할 것이다. 그리고 브루가 제출한 $T$개의 순열 각각을 동현이 섞어 새로운 순열 $T$개를 만들고, 이 $T$개의 순열을 임의의 순서로 민규에게 전달할 것이다.
당연하게도, 브루와 민규는 게임이 시작되기 전 전략을 논의할 수 있다. 또한, 브루와 민규는 게임 전 $N$과 $L$의 값을 직접 정할 수 있다. $N$과 $L$의 값에 따라 게임의 난이도, 그리고 게임 승리 시 얻는 점수가 결정된다. 난이도가 쉽게 두 변수를 정하면 게임에서 승리할 수 있겠지만, 얻는 점수가 더 낮아질 것이다.
브루와 민규를 위해 게임에서 승리할 수 있는 최선의 전략을 만들어 주자.
이 문제에서, 당신의 프로그램은 총 두 번 실행될 것이다. 첫 번째 실행에서는 브루의 역할을 수행해야 하고, 두 번째 실행에서는 민규의 역할을 수행해야 한다.
만약 $R$이 brue라면, 당신은 브루의 역할을 수행해야 한다. 먼저 브루와 민규가 선언할 두 정수 $N$과 $L$의 값을 띄어쓰기를 사이에 두고 출력한다. 이때 출력 이후 출력 버퍼를 비워야 함에 유의하라.
다음 $T$개의 줄에 걸쳐 각 라운드에 동현이가 제시한 길이 $L$의 비트스트링 $S$가 한 줄에 하나씩 주어진다.
모든 $T$개의 비트스트링에 대해, 각 비트스트링에 대응되는 순열 $A$를 한 줄에 하나씩 출력한다. 이때 순열의 각 원소를 띄어쓰기로 구분해 출력해야 한다. $T$개의 순열을 모두 출력한 이후에는 반드시 출력 버퍼를 비워야 함에 유의하라.
만약 $R$이 mingyu라면, 당신은 민규의 역할을 수행해야 한다. $T$개의 줄에 걸쳐 각 라운드에 동현이가 전달한 순열 $A'$가 원소별로 띄어쓰기를 사이에 두고 주어진다. 이때 순열을 전달받는 순서가 브루가 순열을 만든 순서와 다를 수 있음에 유의하라.
이때 $T$개의 순열에 대응되는 비트스트링 $S$를 각각 한 줄에 하나씩 출력해야 한다. $T$개의 비트스트링을 모두 출력한 이후에는 반드시 출력 버퍼를 비워야 함에 유의하라.
brue 또는 mingyu민규가 모든 비트스트링을 성공적으로 맞혔을 경우, 점수는 $L$의 값에 따라 다음과 같이 부여된다. $\lfloor x\rfloor$는 $x$보다 작거나 같은 가장 큰 정수를 의미한다.
만약 민규가 모든 문자열을 성공적으로 맞히지 못하거나, 출력 형식이 잘못되었거나, $N$과 $L$의 값이 위 어느 경우에도 해당하지 않는 경우 점수를 받을 수 없다.
brue 2 000 100
5 3 3 1 4 2 5 2 1 4 5 3
주어진 예시는 입출력이 어떤 방식으로 이루어지는지 이해를 돕기 위해 의도적으로 개행 간격 등을 조절한 것이며, 실제 입출력에서는 빈 줄을 출력하지 말아야 한다.
mingyu 2 2 1 3 4 5 1 3 4 2 5
100 000
주어진 예시는 입출력이 어떤 방식으로 이루어지는지 이해를 돕기 위해 의도적으로 개행 간격 등을 조절한 것이며, 실제 입출력에서는 빈 줄을 출력하지 말아야 한다.
출력 버퍼를 비우는 방법은 다음과 같다.
fflush(stdout)std::cout << std::flushSystem.out.flush()sys.stdout.flush()이외의 언어에 대해서는 언어별 명세를 참고해야 한다.
School > 서울과학고등학교 > SciOI 2023 C-3번