아직 만들고 있는 페이지입니다.

이 페이지는 아직 만드는 중입니다. 보이는 내용은 바뀔 수 있습니다.

성간 항해

시간 제한1초메모리 제한1024 MB

요약
행성은 번호 순서대로 방문하며 각 행성에서 한 종류의 연료만 넣을 수 있고, 행성 i에서 연료를 채우면 같은 연료가 다시 나오는 다음 행성까지 갈 수 있다. 행성 N에 도달하는 최소 연료 보충 횟수와 그 행성 번호를 구한다.
난이도

보통10점 중 7점

유형
동적 계획법, 그리디, 이분 탐색, 배열
정답자
아직 제출이 없습니다

문제

탐사대가 신세대 우주선을 타고 항해를 떠나려 한다. 행성계의 NN개 행성을 지구에서 승리 행성까지 차례로 방문할 계획이다. 행성들은 방문 순서대로 11부터 NN까지 번호가 매겨져 있으며, 지구는 11번, 승리 행성은 NN번이다.

행성 사이를 이동할 때 우주선은 행성계에 존재하는 어떤 종류의 연료든 사용할 수 있다. 탐사를 시작하기 전 우주선은 지구에 있고 연료 탱크는 비어 있다. 존재하는 연료 종류는 정수로 번호가 매겨져 있으며, ii번 행성에서는 aia_i번 연료만 넣을 수 있다. ii번 행성을 방문했을 때 탱크에 있던 연료를 모두 비우고 aia_i번 연료로 가득 채워 넣을 수 있다.

각 행성의 주유소는 탱크에 같은 종류의 연료를 사용하는 다음 행성까지 이동하는 데 필요한 만큼의 연료만 정확히 넣도록 되어 있다. 만약 그 뒤에 같은 종류의 연료가 나타나지 않으면 그 행성에서는 연료를 넣을 수 없다. 즉, ii번 행성에서 연료를 넣으면 (i+1)(i + 1)번부터 jj번 행성까지 방문할 수 있을 만큼의 연료가 채워지며, 여기서 jj는 j>ij > i이고 aj=aia_j = a_i인 가장 작은 행성 번호이다. jj번 행성보다 더 멀리 탐사를 계속하려면 이 행성들 중 하나에서 다시 연료를 넣어야 한다.

행성별 연료 종류가 주어졌을 때 탐사에 필요한 최소 연료 보급 횟수를 구하는 프로그램을 작성해야 한다.

입력

첫째 줄에 행성의 수 NN이 주어진다 (2⩽N⩽300 0002 \leqslant N \leqslant 300\,000).

둘째 줄에 행성별 연료 종류를 나타내는 NN개의 정수 a1,a2,…,aNa_1, a_2, \ldots, a_N이 주어진다 (1⩽ai⩽300 0001 \leqslant a_i \leqslant 300\,000).

출력

첫째 줄에 해야 하는 연료 보급의 최소 횟수 KK를 출력한다.

둘째 줄에 연료를 넣어야 하는 행성의 번호 KK개를 공백으로 구분하여 출력한다. 행성 번호는 연료를 넣는 시각 순서대로 출력해야 한다.

연료 보급 횟수가 최소인 해가 여러 개라면 그중 아무거나 출력한다. 해가 존재하지 않으면 00을 출력한다.

제한

  • N≤300 000N \le 300\,000

예제2

  1. 예제 1

    입력
    7
    1 3 2 1 3 2 3
    
    예상 출력
    3
    1 3 5
    
  2. 예제 2

    입력
    7
    4 3 2 4 3 2 1
    
    예상 출력
    0