P4309 [TJOI2013]最长上升子序列

发布时间 2023-06-07 15:04:23作者: Flandreqwq

[TJOI2013]最长上升子序列

题目描述

给定一个序列,初始为空。现在我们将1到N的数字插入到序列中,每次将一个数字插入到一个特定的位置。每插入一个数字,我们都想知道此时最长上升子序列长度是多少?

输入格式

第一行一个整数N,表示我们要将1到N插入序列中。

接下是N个数字,第k个数字Xk,表示我们将k插入到位置Xk(0<=Xk<=k-1,1<=k<=N)

输出格式

N行,第i行表示i插入Xi位置后序列的最长上升子序列的长度是多少。

样例 #1

样例输入 #1

3
0 0 2

样例输出 #1

1
1
2

之前偶然乱翻pb_ds库时,意外的学到了一个新的数据结构——rope

大概类似于块状链表,支持随机访问,插入和删除,据OIwiki上所言,其相当于可持久化平衡树的复杂度O(log n)还是比较高效的

这道题就可以用rope来做

第i次插入的数为i,这表明插入的数都是有序的,而大数的插入是不影响之前结果的

所以我们只需要将最终的数列建出来,求出每一个数\(i\)对应的以此数为结尾LIS长度,表示第\(i\)次插入之后以\(i\)为结尾的LIS长度,\(i\)为此时整个数列中最大的数。

要求此时真正的LIS长度,和之前答案的取最大值就行

后来发现rope 这道题好像不如 vector 快......