#P17350. PM11581 PointErasing

PM11581 PointErasing

题目描述

给定一个长度为 NN 的整数序列 yy。它描述了平面上的 NN 个点:对于每个 x=0,1,,N1x=0,1,\ldots,N-1,平面上都有一个点 (x,yx)(x,y_x)

Krolik 会不断进行如下操作:

  1. 从当前尚未被擦除的点中选择两个纵坐标不同的点 A,BA,B
  2. A,BA,B 作为一组对角顶点,作一个边与坐标轴平行的矩形;
  3. 擦除所有严格位于该矩形内部的点。

每次操作必须至少擦除一个点。如果已经不存在合法操作,过程结束。

对于不同的操作顺序,最后剩余的点数可能不同。请找出所有可能的最终剩余点数,并按从小到大的顺序输出。

注意:一个点“严格位于矩形内部”是指它位于矩形内部且不在矩形边界上。

输入格式

第一行输入一个整数 NN

第二行输入 NN 个整数 y0,y1,,yN1y_0,y_1,\ldots,y_{N-1},其中第 ii 个点的坐标为 (i,yi)(i,y_i)

输出格式

第一行输出一个整数 MM,表示可能的最终剩余点数的种类数。

第二行按从小到大的顺序输出 MM 个整数,表示所有可能的最终剩余点数。

数据范围与约定

  • 1N501\le N\le 50
  • 0yi1090\le y_i\le 10^9

输入输出样例 #1

输入 #1

7
1 2 1 1 0 4 3

输出 #1

2
4 6

输入输出样例 #2

输入 #2

8
0 0 4 4 8 8 4 4

输出 #2

1
6

输入输出样例 #3

输入 #3

1
522

输出 #3

1
1

样例说明

对于样例 1,一种得到 44 个剩余点的方法是:先选择 (1,2)(1,2)(4,0)(4,0),擦除 (2,1)(2,1)(3,1)(3,1);再选择 (0,1)(0,1)(5,4)(5,4),擦除 (1,2)(1,2)。此时剩余 44 个点。

如果第一步直接选择 (0,1)(0,1)(5,4)(5,4),则只会擦除 (1,2)(1,2),之后不再存在合法操作,最终会剩余 66 个点。因此所有可能答案为 4,64,6