#T0087. 排序与去重

0

排序与去重

题目背景

在一次数据整理工作中,工作人员收集到一大批编号,其中有不少重复。现在需要把这些编号按从小到大的顺序排列,并去掉重复的编号,每种编号只保留一个。

题目描述

给定 nn 个整数 a1,a2,,ana_1,a_2,\dots,a_n(可能有重复,可能为负数)。请将它们去重后按升序排列

  • 第一行输出去重后数字的个数 mm
  • 第二行输出这 mm 个数字,相邻数字之间用一个空格分隔。

输入格式

第一行一个整数 nn

第二行 nn 个整数 a1,a2,,ana_1,a_2,\dots,a_n

输出格式

第一行一个整数 mm

第二行 mm 个整数,为去重并升序排序后的结果,用空格分隔。

样例输入1

8
3 1 2 3 2 1 5 1

样例输出1

4
1 2 3 5

样例输入2

10
-7 2000000000 -7 0 3 -2000000000 0 3 2000000000 -1

样例输出2

6
-2000000000 -7 -1 0 3 2000000000

样例输入3(稍大,包含重复、负数和边界值)

12
12 7 -3 7 0 2000000000 12 -2000000000 0 -3 7 5

样例输出3

7
-2000000000 -3 0 5 7 12 2000000000

数据范围与约定

  • 1n20000001\le n\le 2\,000\,000
  • ai2×109|a_i|\le 2\times 10^9

提示

数据量较大,请使用较快的输入方式(例如 scanf,或关闭 cinstdio 的同步)。先整体排序,再用双指针(或利用有序性)相邻比较去重,是一种直接且高效的做法。