벽돌깨기

NYPC 2017 · 예선 스테이지 2

넥슨에서 새로 개발하고 있는 벽돌깨기 게임은 다음과 같은 규칙으로 이루어져 있다.

  • 직사각형 모양의 벽돌들이 NN줄로 놓여져 있다. 한 줄에는 최소 00개, 최대 1010억개의 벽돌이 쌓여 있을 수 있다.
  • 입력으로 각 줄에 놓인 벽돌의 숫자들, 그리고 1부터 N까지의 정수가 각각 정확하게 한번씩 나온 순열 하나가 주어진다.
  • 여러분의 임무는 각 줄에 놓인 벽돌의 수의 순서가 주어진 정수의 순열의 순서와 일치하게 벽돌을 깨서 부수는 것이다. 즉, 순열의 첫번째 수를 P(1)P(1), 두번째 수를 P(2)P(2), ⋯\cdots, ii번째 수를 P(i)P(i)라고 한다면, ii번째 줄에 놓인 벽돌의 수보다 벽돌이 적게 쌓인 줄은 정확하게 P(i)−1P(i)-1개 있어야 한다. 다르게 설명하면, 순열에서 주어진 순서대로 벽돌이 놓인 줄을 방문하고 이 줄에 놓인 벽돌의 수를 세면, 점점 커지는 오름차순이 되어야 한다.
  • 입력에는 둘 이상의 줄에 같은 수의 벽돌이 주어질 수 있지만, 최종 결과에서는 각각의 줄에 다른 수의 벽돌이 놓여야 한다.
  • 이를 위해서, 가장 적은 수의 벽돌을 부수어야 최고 점수를 받을 수 있다.

아래 그림의 예를 고려해보자. N=5N=5줄로 벽돌들이 쌓여 있고, 입력받은 순열은 (1,3,2,5,4)(1, 3, 2, 5, 4)라고 하자.

11번 줄에 있는 벽돌 22개를 깨고, 22번 줄에 있는 벽돌 22개를 깬 결과는 다음과 같다. 이 결과가 조건을 만족하며, 많은 방법 중에서 가장 벽돌을 깨는 횟수가 적은 답이 된다.

반면, 같은 입력에 대해서 순열이 (1,2,4,5,3)(1, 2, 4, 5, 3)으로 주어진다면 이 경우에 대해서는 답이 존재하지 않는데, 벽돌을 없애는 것만으로는 33번째 줄이 전체에서 44번째로 돌이 많게 할 수는 없기 때문이다.

벽돌의 줄 수, 각 줄에 쌓인 벽돌의 수, 입력 순열이 주어졌을 때 주어진 순열과 각 열에 쌓인 벽돌의 수의 순서가 일치하게 하도록 벽돌을 깨는 횟수의 최소값을 구하는 프로그램을 작성하시오.

입력 형식

첫째 줄에 벽돌의 줄 수를 나타내는 자연수 NN (11 이상 200 000200\,000 이하)이 주어진다.

다음 줄에는 NN개의 자연수가 주어지는데, 각각 왼쪽부터 오른쪽으로 차례로 각 줄을 보았을 때 이 줄에 쌓여있는 벽돌 수를 나타낸다. 한 줄에 올 수 있는 벽돌의 수는 00 이상 1 000 000 0001\,000\,000\,000 이하이다.

그 다음 줄에는 11부터 NN 사이의 숫자가 정확하게 한번씩 포함된 NN개의 숫자로 이루어진 순열이 주어진다.

출력 형식

한 줄로 결과를 출력한다. 여기에는 주어진 조건을 만족하게 하도록 벽돌을 깨는 횟수의 최소값을 출력한다. 만약 벽돌을 깨는 것으로 조건을 만족할 수 없다면, -1을 출력한다. 아무 벽돌을 깨지 않더라도 조건을 만족한다면 00을 출력한다.

예제 1

입력

5 3 5 2 6 4 1 3 2 5 4

출력

4

예제 2

입력

5 3 5 2 6 4 1 2 4 5 3

출력

-1

채점 방식

입력 케이스들은 다음과 같은 종류로 구별되며, 한 종류의 케이스를 다 맞추어야 그 종류에 배정된 점수를 받을 수 있다.

종류 1: 60점

N≤1 000N \le 1\,000이고 한 줄에 쌓일 수 있는 벽돌의 수는 최대 10 00010\,000.

종류 2: 140점

문제의 원래 제한조건 이외의 추가된 제한이 없음.

해설