여왕벌 Batch 컴파일 명령
시간 제한 | 메모리 제한 | 제출 횟수 | 통과한 사람 수 | 비율 |
---|---|---|---|---|
5000 ms | 512 MiB | 85 | 9 | 10.59% |
크기가 M×M인 격자 형태의 벌집이 있다. 이 벌집의 각 칸에는 여왕벌이 될 애벌레들이 한 마리씩 자라고 있다.
격자칸의 좌표계를 다음과 같이 설정한다. 제일 왼쪽 위 칸의 좌표는 (0, 0)이다. 그 아래쪽 칸들의 좌표는 순서대로 (1, 0), (2, 0), ... 등이다. 좌표가 (i, 0)인 칸의 오른쪽 칸들의 좌표는 순서대로 (i, 1), (i, 2), ... 등이다.
애벌레들은 매일 에너지를 모아서 정오(낮 12시)에 한번 자라는데, 여기에 걸리는 시간은 매우 짧아서 무시할 수 있다. 첫날 아침 모든 애벌레들의 크기는 1이고, 이러한 과정을 N일 동안 반복한다.
각 애벌레가 자라서 크기가 커지는 정도는 하루에 +0, +1, +2의 세 가지 중 하나이다. 더하기(+) 기호는 앞으로 생략한다. 구체적으로 각 애벌레가 자라는 정도를 결정하는 규칙은 다음과 같다.
- 제일 왼쪽 열과, 제일 위쪽 행의 애벌레들은 자신이 자라는 정도를 스스로 결정한다. 이들은 입력으로 주어질 것이다. 애벌레들이 자라는 정도를 왼쪽 제일 아래 칸에서 시작하여 위쪽으로 가면서 읽고, 제일 위쪽 칸에 도착하면 오른쪽으로 가면서 행의 끝까지 읽었다고 하자. 모든 입력에서 이렇게 읽은 값들은 감소하지 않는 형태이다.
- 나머지 애벌레들은 자신의 왼쪽(L), 왼쪽 위(D), 위쪽(U)의 애벌레들이 자라는 것을 완료한 후에, 그 세 애벌레들이 자란 정도에 따라 자신이 자라는 정도를 결정한다. 자신에게 영향을 주는 세 애벌레가 자란 정도의 가능한 경우의 수는 27가지가 있고, 각 경우에 대해 세 애벌레 중 어느 애벌레를 따라서 자랄지가 결정된다.
- (2)에 해당하는 27가지 경우 각각에 대해서, 자신에 영향을 주는 세 애벌레 중 어느 것을 따를 것인지는 애벌레마다 다를 수 있다. (각 애벌레의 해당 규칙은 입력으로 주어진다.)
다음 페이지의 표 1은 4×4격자에 대한 애벌레 규칙의 예로, 16마리의 애벌레들 중, 다른 애벌레를 따라 자신이 자라는 정도를 결정하는 9마리의 애벌레들의 규칙을 보이고 있다. 표의 제일 왼쪽 열은 애벌레들의 좌표를 행우선 순서로 위에서 아래로 나열한 것이다. 표의 위쪽 세 행은 각 애벌레에 대해서 왼쪽(L), 왼쪽 위(D), 위쪽(U)의 애벌레가 자라는 27가지 경우들을 보이고 있다. 표의 나머지 칸들에 대해서, 그 값이 L이면 그 칸에 해당하는 애벌레가 왼쪽 애벌레가 자라는 정도를 따른다는 것이고, D이면 왼쪽 위 애벌레가 자라는 정도를 따르며, U이면 위쪽 애벌레가 자라는 정도를 따른다는 뜻이다.
예를 들어, 표 중앙의 회색 바탕의 칸에 있는 U의 의미에 대해 설명하면 다음과 같다. 좌표가 (2, 1)인 칸에 있는 애벌레는, 그 왼쪽(좌표 (2, 0)인 칸)의 애벌레가 1의 크기가 자랐고, 왼쪽 위(좌표 (1, 0)인 칸)의 애벌레가 1의 크기가 자랐고, 위(좌표 (1, 1)인 칸)의 애벌레가 0의 크기만큼 자란 경우, 위쪽(U) 애벌레가 자란 정도를 따른다는 것이다. 이 경우는 0의 크기만큼 자라게 된다
M = 4, N = 2인 예를 하나 들어보자. 다음은 각 격자에 있는 애벌레의 첫날 아침의 크기이다.
다른 애벌레를 따라 자신이 자라는 정도를 결정하는 애벌레들의 규칙은 표 1과 같다. 처음 2일 동안 제일 왼쪽 열과 제일 위쪽 행에 있는 7마리의 애벌레들이 자라는 정도를 왼쪽 제일 아래 칸에서 시작하여 위쪽으로 가면서 읽고, 제일 위쪽 칸에 도착하면 오른쪽으로 가면서 행의 끝까지 읽었을 때, 다음과 같다고 하자.
- 1일: 0, 0, 1, 1, 1, 2, 2
- 2일: 1, 1, 1, 1, 1, 1, 2
첫날 저녁에 애벌레들은 아래와 같은 크기를 가진다. 예를 들어, 좌표 (1, 1)의 애벌레는 왼쪽 애벌레의 크기가 1만큼 자랐고, 왼쪽 위의 애벌레가 1만큼 자랐고, 위쪽 애벌레도 1만큼 자랐으므로, 표 1에 따라 왼쪽 애벌레가 자란 정도인 1만큼을 자란다. 또, 좌표 (3, 2)의 애벌레는 규칙을 보면 1만큼 자람을 알 수 있다. 표 1에 방금 사용된 두 규칙을 동그라미가 쳐진 글자로 표시하였다.
둘째 날이 지났을 때는 동일한 과정에 따라 다음과 같이 됨을 확인할 수 있다.
격자칸의 크기, 날자 수, 애벌레들이 자라는 규칙과 날자별 제일 왼쪽 열과 제일 위쪽 행의 애벌레들이 자라는 정도를 입력으로 받아 마지막 날 저녁의 애벌레들의 크기를 출력하는 프로그램을 작성하라.
입력 형식
입력의 첫 줄에는 격자칸의 가로와 세로 크기 M(2 ≤ M ≤ 700)과 날자 수 N(1 ≤ N ≤ 1,000,000)이 자연수로 주어진다. 첫날 아침의 애벌레 크기는 모두 1이므로 입력에 주어지지 않는다.
이어진 (M-1)×(M-1) 줄에는 다른 애벌레가 자란 정도의 영향을 따라서 자신이 자라는 정도를 결정하는 애벌레들의 규칙이 행우선 순서로 주어진다. 각 애벌레에 대한 한 줄은 왼쪽 애벌레가 자란 크기가 a, 왼쪽 위 애벌레가 자란 크기가 b, 위쪽 애벌레가 자란 크기가 c라고 하면, 모든 가능한 순서쌍 (a, b, c)들을 a우선, 그 다음으로 b우선, 마지막으로 c에 대해서 오름차순으로 정렬한 것에 대한 규칙을 순서대로 보인 것이다. (표 1에서 보인 것과 동일한 순서이다.) 각 줄은 27개의 대문자가 연속으로 이어진 문자열로 주어진다.
다음 N개의 줄에는 첫날부터 순서대로 제일 왼쪽 열과 제일 위쪽 행의 애벌레들이 자라는 정도가 다음의 형식으로 주어진다. 본문에서 보인 것과 같이, 자라는 크기를 제일 왼쪽 아래 칸에서 시작해서 위쪽으로 올라가서 제일 위쪽에 도착하면 오른쪽으로 이동하며 읽었다고 하자. 이 값들은 감소하지 않는다. 따라서, 이 수열을 처음부터 읽었을 때 0의 개수, 1의 개수, 2의 개수를 순서대로 입력에 준다. 하루에 대해서 이 세 개수들의 합은 2M-1임이 자명하다. 세 값들 중에 0이 있을 수 있다.
출력 형식
M개의 줄에 각각 M개의 자연수를 출력한다. 이는 각 애벌레의 마지막 날 저녁의 크기를 첫 행부터, 각 행에서는 왼쪽부터 제시한 것이다. (본문의 예와 동일한 형태이다.)
부분문제의 제약 조건
- 부분문제 1: 전체 점수 100점 중 10점에 해당하며, N = 1이다.
- 부분문제 2: 전체 점수 100점 중 24점에 해당하며, N ≤ 10,000이고 모든 날에 대해서 2의 개수가 0이다.
- 부분문제 3: 전체 점수 100점 중 34점에 해당하며, N ≤ 10,000이다.
- 부분문제 4: 전체 점수 100점 중 32점에 해당하며, 원래의 제약조건 이외에 아무 제약 조건이 없다.
- 부분문제 5: 전체 점수에 포함되지 않는 추가 1점 데이터이며, 원래의 제약조건 이외에 아무 제약 조건이 없다. 탑골드 운영진 윤지학이 추가한 데이터로써, 대회 공식 데이터보다 강력할... 것이다?
입력과 출력 예제
입력 예시 | 출력 예시 |
---|---|
2 3 UDLLDUDLLLLDULDUUUDDDLLLDDD 1 1 1 0 3 0 0 0 3 | 5 6 4 6 |
4 2 LLLLLLLLLLLLLLLLLLLLLLLLLLL UDLUDLUDLUDLUDLUDLUDLUDLUDL LDUUDDDLLDLLLLDDDDUUUDDDLLL DDLUUDLLDLDDUDLDDDDLDDDDLDD DDLLULDDDLLLLDDUULLUUULUUUL LLLLUUULLLLUUUUDDLDUDLLLUDU LLDDUULLLUUULDDUUULDUUULDUU DDDDDDDDDDDDDDDDDDDDDDDDDDD UUUUUUUUUUUUUUUUUUUUUUUUUUU 2 3 2 0 6 1 | 3 3 4 5 3 3 3 4 2 3 3 4 2 2 3 4 |