AT_arc125_c [ARC125C] LIS to Original Sequence 题解
写个暴力,造几组小数据,观察规律发现,答案总是形如 $a_1(b_1)a_2(b_2)a_3(b_3)\dots a_{k-1}(b_{k-1})+\{c\}$
(其中 $+$ 表示序列拼接,$b_i$ 表示小于 $a_i$ 且之前没出现过的最小数,$c$ 为之前没出现过的数降序排序的结果)
$a_1(b_1)a_2(b_2)a_3(b_3)\dots a_{k-1}(b_{k-1})$ 中不存在长度 $>k-1$ 的上升子序列,可以保证 $\{a_k\}$ 是答案的 LIS。
#include <cstdio>
int n, k;
bool b[200050];
int main()
{
scanf("%d%d", &n, &k);
for (int i = 1, x, p = 1; i < k; ++i)
{
scanf("%d", &x);
printf("%d ", x);
b[x] = 1;
while (b[p])
++p;
if (p < x)
printf("%d ", p), b[p] = 1;
}
for (int i = n; i; --i)
if (!b[i])
printf("%d ", i);
return 0;
}

浙公网安备 33010602011771号