(R+2) 행 C 열 격자 모양의 들판이 있습니다. 가장 위쪽 행에는 씨앗이 떨어지는 꽃이, 가장 아래쪽 행에는 씨앗을 저장하는 굴이 한 칸에 하나씩 총 C개 있으며, 가운데 R개의 행은 모두 빈 칸입니다. 이 문제에서 당신의 임무는
빈 칸으로 이루어진 행의 개수 R을 설정하고,
빈 칸에 다람쥐 혹은 햄스터를 적절히 배치하고, 씨앗을 옮길 방법을 정하는 것
입니다. 당신은 각 꽃에서 떨어지는 씨앗을 최대한 요구치에 가깝게 각 굴로 옮겨야 합니다.
빈 칸을 기준으로 위에서 r번째 행, 왼쪽에서 c번째 열에 해당하는 칸을 (r,c)라고 합시다. 또한, 가장 위쪽 행의 꽃은 각각 (0,1),(0,2),⋯,(0,C), 가장 아래쪽 행의 굴은 각각 (R+1,1),(R+1,2),⋯,(R+1,C)라고 합시다.
꽃 (0,i)에서는 씨앗이 Ai개 열립니다.
굴 (R+1,i)까지 씨앗을 Bi개 옮기려고 합니다.
꽃에 열리는 씨앗의 총 개수와, 굴까지 옮겨야할 씨앗의 총 개수는 같습니다. 즉, A1+A2+⋯+AC=B1+B2+⋯+BC입니다.
가장 많은 씨앗이 열리는 꽃에서는 M개의 씨앗이 열립니다. 또한, 각 굴에서 요구하는 씨앗의 최대 개수는 M 이하입니다. 즉, max(B1,B2,⋯,BC)≤max(A1,A2,⋯,AC)=M입니다.
격자의 빈 칸에는 다람쥐 혹은 햄스터를 배치할 수 있습니다. 각 다람쥐 혹은 햄스터는 자신의 칸의 씨앗을 정해진 규칙에 따라 다른 칸으로 옮깁니다.
다람쥐: 상하좌우로 인접한 칸으로 씨앗을 보낼 수 있습니다. ↑, ↓, ←, → 중 원하는 방향을 원하는 순서대로 고르면, 해당 칸으로 씨앗을 배분합니다.
햄스터: 같은 행이나 같은 열에 있는 인접하지 않은 칸을 골라서 멀리 씨앗을 보낼 수 있습니다.
배치가 끝나면, T초에 걸쳐 씨앗 운반이 시작됩니다. 각 시각 t=1,2,⋯,T초에는 다음 과정이 순서대로 발생합니다.
씨앗 수확: 각 꽃 (0,i)는 t=M−Ai+1,M−Ai+2,⋯,M인 동안 씨앗을 1개씩 (1,i)로 떨어뜨립니다.
씨앗 보내기: 모든 다람쥐와 햄스터가 동시에 자신의 칸에 있는 씨앗을 다른 칸으로 보냅니다.
다람쥐: 각 다람쥐는 지난번에 마지막으로 씨앗을 보냈던 방향의 다음 순서부터 시작하여, 고른 방향 순서대로 돌아가며 씨앗을 한 개씩 보냅니다. 같은 방향으로는 최대 한 개씩만 보냅니다.
햄스터: 자신의 칸에 씨앗이 있다면 정해진 다른 칸으로 씨앗을 1개 보냅니다.
이 과정에서 칸에 있는 모든 씨앗을 다른 칸으로 보내지 못한 경우, 칸이 과부하됩니다.
빈 칸 혹은 굴에 남아있는 씨앗을 옮길 다람쥐 혹은 햄스터가 없는 경우도 마찬가지로 과부하됩니다.
예시: 다람쥐에게 4개의 칸을 골라 [↑, ↓, ←, →] 순서로 보내도록 지정한 경우,
시각 T: 칸에 씨앗이 2개 있다면, ↑, ↓로 씨앗을 한 개 보냅니다.
시각 T+1: 칸에 씨앗이 3개 있다면, ↓ 다음 순서인 ←부터 시작해서 ←, →, ↑으로 씨앗을 한 개 보냅니다.
시각 T+2: 칸에 씨앗이 6개 있다면, ↑ 다음 순서인 ↓부터 시작해서 ↓, ←, →, ↑으로 씨앗을 한 개 보냅니다. 남은 씨앗 2개는 가지고 있습니다. 해당 칸은 과부하된 칸이 됩니다.
씨앗 받기: 과부하된 칸이 바로 직전의 씨앗 보내기 단계에서 받은 모든 씨앗을 원래 칸으로 되돌려놓습니다.
씨앗 저장: (R+1,i)에 씨앗이 떨어져 있다면, 씨앗 1개가 굴 안으로 굴러떨어집니다. 이 씨앗은 더 이상 운반될 일이 없습니다.
입력 형식
첫 줄에 C,T,M이 공백으로 구분되어 주어집니다.
다음 줄에 A1,A2,⋯,AC가 공백으로 구분되어 주어집니다.
다음 줄에 B1,B2,⋯,BC가 공백으로 구분되어 주어집니다.
출력 형식
첫 줄에 사용하기로 결정한 격자판 행의 개수 R을 출력합니다. R은 C 이상 C+20이하의 수여야 합니다.
다음 줄부터 R개의 줄 각각에 C개의 문자열을 공백으로 구분하여 출력합니다. r번째 줄의 c번째 문자열은 (r,c)에 있는 다람쥐가 씨앗을 전달하는 방법을 의미합니다. 위쪽을 U, 아래쪽을 D, 오른쪽을 R, 왼쪽을 L이라는 문자로 표현합니다. 꽃으로는 씨앗을 보낼 수 없습니다.
다람쥐: 고른 방향을 순서대로 공백 없이 붙여서 표현합니다. 만약 고른 방향이 없다면 X로 표시합니다.
[위, 아래, 오른쪽] 은 UDR로 표현합니다.
햄스터: 고른 격자칸까지의 거리와 방향을 차례대로 공백 없이 붙여서 표현합니다.
12칸 아래의 격자칸으로 씨앗을 던지고 싶다면 12D 로 표현합니다.
제한
5≤C≤10
T=2000000
100000≤M≤1000000
0≤Ai≤M(1≤i≤C)
0≤Bi≤M(1≤i≤C)
A1+A2+⋯+AC=B1+B2+⋯+BC=1000000
max(A1,A2,⋯,AC)=M
채점
챌린지 문제는 전체 문제의 점수의 50% 비중을 차지합니다.
올바르지 않은 출력을 한 경우, 즉, 출력 형식을 맞추지 않았거나, 존재하지 않은 칸에 씨앗을 던지려 한 경우 0점입니다.
아닌 경우, T초가 끝난 이후 (R+1,i)에 있는 씨앗 굴에 있는 씨앗의 개수를 Bi′라고 할 때
오차: 운반해야 하는 씨앗 개수와, 실제로 운반된 씨앗 개수의 차이 합 E=∑i=1C∣Bi′−Bi∣
손실: 굴로 운반되지 못한 씨앗의 개수 L=∑i=1CBi−∑i=1CBi′
지연: L>0이라면 D=T, 아닐 경우 마지막 씨앗이 굴로 들어간 시간을 Tlast라고 할 때, D=Tlast−M
이때 비용은 다음과 같은 방법으로 정해집니다.
Cost=2R−C+max(E,D)+T×L
비용이 낮을수록 더 좋은 결과입니다.
이때의 각 테스트케이스의 점수는 다음과 같은 방법으로 정해집니다.
전체 참가자의 수: ntot
자신보다 비용이 낮은 참가자의 수: nlose
자신과 비용이 같은 다른 참가자의 수: ndraw
Score=⌊106(1−0.5ntotnlose+0.5ndraw)⌋
챌린지 문제의 최종 점수는 최종 평가에 사용된 각 테스트 케이스 점수의 평균이 됩니다. 비슷하게, 중간 평가의 점수는 중간 평가에 사용된 각 테스트 케이스 점수의 평균이 되며, 이 점수는 참고용으로 최종 점수에 반영되지 않습니다. 평가에는 예제 코드보다 낮은 비용을 받은 제출만 채점됩니다.
문제의 점수는 각 테스트 케이스 별로 매겨지며, 최종 점수는 테스트 케이스별 점수의 평균으로 계산됩니다.