P4309 [TJOI2013]最长上升子序列
[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
快......