P14556 [ROI 2013 Day2] 星际航程

题目描述

一支远征队准备乘坐新一代宇宙飞船启程。计划依次访问恒星系中的 $N$ 颗行星——从地球到胜利星。行星按访问顺序编号为 $1$ 到 $N$,地球编号为 $1$,胜利星编号为 $N$。 对于行星间的飞行,飞船可以使用恒星系中存在的任何燃料类型。在远征开始前,飞船位于地球,并且飞船的燃料箱是空的。现有燃料类型用整数编号,在编号为 $i$ 的行星上只能加注类型为 $a_i$ 的燃料。访问第 $i$ 颗行星时,可以清空燃料箱中已有的燃料,然后加满类型为 $a_i$ 的燃料。 每颗行星上的加油站设置使得,加注的燃料量恰好足够飞行到下一颗具有相同燃料类型的行星。如果后续没有该类型的燃料,则无法在该行星上加注。换句话说,在第 $i$ 颗行星加注后,燃料足够访问从第 $(i + 1)$ 颗到第 $j$ 颗行星(包含),其中 $j$ 是满足 $j > i$ 且 $a_j = a_i$ 的最小编号行星。为了继续远征至第 $j$ 颗行星之后,飞船需要在这些行星中的某一颗再次加注。 需要编写一个程序,根据给定的行星燃料类型,确定远征所需的最小加注次数。

输入格式

输入文件的第一行写有数字 $N$($2 \leqslant N \leqslant 300,000$)——行星的数量。 输入文件的第二行写有 $N$ 个整数 $a_1, a_2, \ldots, a_N$($1 \leqslant a_i \leqslant 300,000$)——行星上的燃料类型。

输出格式

输出文件的第一行输出唯一数字 $K$——需要执行的最小加注次数。 第二行输出 $K$ 个数字,以空格分隔——需要加注的行星编号。行星编号按加注时间顺序输出。 如果存在多个具有最小加注次数的解决方案,输出其中任意一个。如果无解,输出数字 $0$。

说明/提示

### 评分 本题包含两个子任务。每个子任务的评分使用独立的测试组。仅当通过该组所有测试时,子任务的得分才会被计入。 #### 子任务 1 $N \le 3000$。该子任务分值为 $50$ 分。 #### 子任务 2 $N \le 300,000$。该子任务分值为 $50$ 分。