#P16077. [Oni2019]Compact

[Oni2019]Compact

题目描述

给定一个长度为 NN 的序列 aa,其中每个元素都是不超过 MM 的正整数。

现在希望把整个序列划分成尽可能多的稳定组。一个稳定组是序列中的一个非空连续子段:

as,as+1,as+2,,ada_s,a_{s+1},a_{s+2},\ldots,a_d

并且满足如下条件:

对于任意不在区间 [s,d][s,d] 内的位置 iiaia_i 必须满足下面两种情况之一:

  1. aia_i 严格小于区间 [s,d][s,d] 内的所有值;
  2. aia_i 严格大于区间 [s,d][s,d] 内的所有值。

也就是说,对于一个稳定组,组外不能出现落在该组最小值与最大值之间的元素。

一次划分要求每个元素恰好属于一个稳定组。

任务

给定 N,MN,M 和序列 aa,求一种把序列划分成尽可能多的稳定组的方案。

如果有多种稳定组数量最多的方案,输出字典序最小的方案。

输入格式

第一行包含两个整数 N,MN,M

第二行包含 NN 个整数,表示序列:

a1,a2,,aNa_1,a_2,\ldots,a_N

输出格式

输出两行。

第一行输出一个整数 GG,表示最多可以划分出的稳定组数量。

第二行输出 GG 个整数,表示每个稳定组最后一个元素的位置,按递增顺序输出。

数据范围

  • 1N10000001\le N\le 1\,000\,000
  • 1MN1\le M\le N
  • 1aiM1\le a_i\le M
  • 保证 11MM 中的每个整数都至少在序列中出现一次;
  • 输出方案中的最后一个位置一定为 NN
  • 若存在多个稳定组数量最大的方案,输出字典序最小的方案。

子任务

子任务 分值 限制
1 21 N100N\le 100
2 28 N3000N\le 3000
3 51 无额外限制

样例

样例 1

输入

6 5
1 4 2 3 5 5

输出

5
1 2 3 4 6

样例 2

输入

7 5
1 3 2 1 5 2 4

输出

1
7

样例 3

输入

14 10
5 8 6 7 5 2 1 2 3 3 4 10 9 10

输出

5
5 8 10 11 14

样例 4

输入

4 3
3 1 2 1

输出

2
1 4