티스토리 뷰

IOI/IOI2014

[IOI2014 Day2] Gondola 해법

전명우 2014.07.17 20:51

이 문제는 여러 개의 부분 문제(서브태스크)가 하나의 문제를 이루어, 이 문제를 해결하기 위해서 3개의 코드를 짜야한다. 문제의 난이도는 매우 쉬운 편이며, 3개의 방법에 대해서 꼼꼼히 생각해야 되기 때문에 귀찮은 문제라고 생각한다.


1) 곤돌라 수열 확인

우선 곤돌라 수열에서 같은 수가 여러 개 있는 경우 이는 자명히 불가능한 곤돌라 수열이다.

그렇지 않은 경우, 주어진 곤돌라 수열에 있는 1 이상 $n$ 이하의 수에 신경써야한다. 곤돌라 수열에 1 이상 $n$ 이하의 수가 없다면, 이는 항상 가능한 곤돌라 수열이다.

만약 1 이상 $n$ 이하의 수가 하나라도 있다면, 초기 1의 위치를 짐작할 수 있으며, 다른 1 이상 $n$ 이하의 수가 그 1의 위치에 대해 상대적으로 올바른 위치에 있는지 확인하면 된다.


2) 교체 수열

가능한 교체 수열 중 한 가지만 구하면 되는 것이므로 매우 간단하게 풀리는 문제다. 문제의 조건에서 불가능한 곤돌라 수열은 주어지지 않으므로 따로 확인하지 않아도 된다.

1)에서 말했듯이 1이상 $n$ 이하의 수를 통하여 초기 1의 위치를 유추한다. 만약 그러한 수가 없다면, 1의 위치를 0 번지라고 가정하여도 상관 없다. 교체 수열을 구하기 위해 초기 1의 위치를 통해 초기 곤돌라 수열을 구하고 $n+1 \leq i \leq m$ (여기서 $m$은 주어진 곤돌라 수열에서 가장 큰 값)인 $i$를 곤돌라 수열의 어느 위치에 교체할 것인지 적절히 계산하면 된다. 자명하게도 교체 수열의 길이는 $m-n$ 이다.


3) 교체 수열의 개수 세기

우선, 1)의 함수를 통하여 가능한 곤돌라 수열인지 확인한다. 만약 불가능한 곤돌라 수열이라면 교체 수열의 개수는 0 이다. 이제 곤돌라 수열에서 $n$보다 큰 값을 모아 오름차순으로 정렬하고 이를 수열 $a$라고 하자. 처음 $x = n$이라고 하고, $a[0]$ 부터 순서대로 처리한다. $a[0] > x+1$ 인 경우 $x$와 $a[0]$ 사이에 교체되어야 하는 수가 있다는 것이고 그것의 개수가 $a[0]-x-1$ 이다. 그 교체되는 값이 들어갈 수 있는 자리의 수가 $y$개라고 하면, 가능한 경우의 수는 $y^{a[0]-x-1}$ 이다. 이는 repeated squaring 을 통해 빠르게 계산할 수 있다. $a[0]$에 대한 처리는 끝났으며, $x = a[0]$으로 대입하고 $a[1]$에 대한 처리로 넘어간다. 이를 반복하면 된다.


코드 보기


저작자 표시
신고

'IOI > IOI2014' 카테고리의 다른 글

[IOI2014 Day2] Holiday 해법  (0) 2015.07.31
[IOI2014 Day2] Friend 해법  (0) 2014.07.18
[IOI2014 Day2] Gondola 해법  (0) 2014.07.17
IOI2014 Day 2 종료  (0) 2014.07.17
[IOI2014 Day1] Rail 해법  (0) 2014.07.17
[IOI2014 Day1] Game 해법  (1) 2014.07.17
댓글
댓글쓰기 폼