Description
给定一个序列,初始为空。现在我们将1到N的数字插入到序列中,每次将一个数字插入到一个特定的位置。每插入一个数字,我们都想知道此时最长上升子序列长度是多少?
Input
第一行一个整数N,表示我们要将1到N插入序列中,接下是N个数字,第k个数字Xk,表示我们将k插入到位置Xk(0<=Xk<=k-1,1<=k<=N)
Output
N行,第i行表示i插入Xi位置后序列的最长上升子序列的长度是多少。
Sample Input
3 0 0 2
Sample Output
1 1 2
HINT
X0等于0 ,我们将1插入到位置0得到序列{1}
X1等于0 ,我们将1插入到位置0得到序列{2,1}X2等于2 ,我们将1插入到位置0得到序列{2,1,3}数据范围30%的数据 n<=1000100%的数据 n<=100000 这题……看上去不难……但是为什么我wa的停不下来
首先先随便搞搞把最终得到的数列求出来。treap和splay都行。spaly也没话说
有一点很重要!左旋右旋更新儿子信息的时候一定要先更新k再更新t,因为旋完t是在k上面的(啊啊啊啊啊啊就是这里我跪的停不下来了)
然后就可以考虑怎样计算lis了
其实一开始在这里我有点乱了。显然我们只要求1到i中小于等于a[i]的数字的lis就好了
先随便画几组数据
7
0 0 1 3 2 4 2
算出来数列是 2 3 7 5 1 6 4
那么以4为例,有用的是2 3 1 4子序列。要在子序列上跑lis
可以这样做:求出一定包含a[i]的lis,然后搞出前缀和,就是包含1、2、3、4的lis啦
#include#include #include #include #include #include #include #include #include #include