#P16077. [Oni2019]Compact
[Oni2019]Compact
题目描述
给定一个长度为 的序列 ,其中每个元素都是不超过 的正整数。
现在希望把整个序列划分成尽可能多的稳定组。一个稳定组是序列中的一个非空连续子段:
并且满足如下条件:
对于任意不在区间 内的位置 , 必须满足下面两种情况之一:
- 严格小于区间 内的所有值;
- 严格大于区间 内的所有值。
也就是说,对于一个稳定组,组外不能出现落在该组最小值与最大值之间的元素。
一次划分要求每个元素恰好属于一个稳定组。
任务
给定 和序列 ,求一种把序列划分成尽可能多的稳定组的方案。
如果有多种稳定组数量最多的方案,输出字典序最小的方案。
输入格式
第一行包含两个整数 。
第二行包含 个整数,表示序列:
输出格式
输出两行。
第一行输出一个整数 ,表示最多可以划分出的稳定组数量。
第二行输出 个整数,表示每个稳定组最后一个元素的位置,按递增顺序输出。
数据范围
- ;
- ;
- ;
- 保证 到 中的每个整数都至少在序列中出现一次;
- 输出方案中的最后一个位置一定为 ;
- 若存在多个稳定组数量最大的方案,输出字典序最小的方案。
子任务
| 子任务 | 分值 | 限制 |
|---|---|---|
| 1 | 21 | |
| 2 | 28 | |
| 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