#CF1144C. 两个混洗序列

两个混洗序列

题目描述

每个测试的时间限制:2 秒
每个测试的内存限制:256 兆字节

最初存在两个整数序列——一个是严格递增的,另一个是严格递减的。

严格递增序列是指 [x1<x2<<xk][x_1 < x_2 < \cdots < x_k] 的整数序列。严格递减序列是指 [y1>y2>>yl][y_1 > y_2 > \cdots > y_l] 的整数序列。注意,空序列和只有一个元素的序列既可以视为递增也可以视为递减。

它们被合并成一个序列 aa,然后 aa 被随机打乱。例如,对于递增序列 [1,3,4][1,3,4] 和递减序列 [10,4,2][10,4,2],可能的混洗结果序列 aa[1,2,3,4,4,10][1,2,3,4,4,10][4,2,1,10,4,3][4,2,1,10,4,3] 等。

现在输入这个打乱后的序列 aa

你的任务是找到两个合适的初始序列。一个应该是严格递增的,另一个应该是严格递减的。注意,空序列和只有一个元素的序列既可以视为递增也可以视为递减。

如果输入存在矛盾,无法将给定的 aa 拆分成递增序列和递减序列,则输出 "NO"

输入格式

第一行包含一个整数 nn1n21051 \le n \le 2 \cdot 10^5)—— 序列 aa 的元素个数。

第二行包含 nn 个整数 a1,a2,,ana_1, a_2, \dots, a_n0ai21050 \le a_i \le 2 \cdot 10^5),其中 aia_iaa 的第 ii 个元素。

输出格式

如果存在矛盾,无法将 aa 拆分成递增和递减序列,则在第一行输出 "NO"

否则,第一行输出 "YES",然后输出两个合适的序列。

  • 第二行输出 nin_i —— 严格递增序列的元素个数。nin_i 可以为 00,此时递增序列为空。
  • 第三行输出 nin_i 个整数 inc1,inc2,,incniinc_1, inc_2, \dots, inc_{n_i},按值递增的顺序排列(inc1<inc2<<incniinc_1 < inc_2 < \cdots < inc_{n_i})—— 严格递增序列本身。如果 ni=0n_i = 0,则此行可以为空(或输出空行)。
  • 第四行输出 ndn_d —— 严格递减序列的元素个数。ndn_d 可以为 00,此时递减序列为空。
  • 第五行输出 ndn_d 个整数 dec1,dec2,,decnddec_1, dec_2, \dots, dec_{n_d},按值递减的顺序排列(dec1>dec2>>decnddec_1 > dec_2 > \cdots > dec_{n_d})—— 严格递减序列本身。如果 nd=0n_d = 0,则此行可以为空(或输出空行)。

必须满足 ni+nd=nn_i + n_d = n,且输出的两个序列的并集是给定序列 aa 的一个排列(当答案为 "YES" 时)。

5
1 2 3 4 5