题目描述
今天是 YQH 的生日,她得到了一个长度为 n 排列 a1,a2,…,an 作为生日礼物,这个排列包含了 1,2,…,n 里每个元素恰好一次。
由于 YQH 十分喜欢升序,于是她打算把这个排列进行排序使得最后排列升序。但是她发现一个问题:她太笨了,不会各种 O(nlogn) 的排序算法,于是她退而求次,准备使用 O(n) 的“斯大林排序”。
斯大林排序是这样一个过程:
假设我们要排序的序列是 a1,2,…,n,那么维护一个初始为空的栈,然后从 1 到 n 枚举 i:
假如 ai 比栈顶严格大或者栈为空,那么把 ai 加入栈中。
否则,此刻有 ai 小于等于栈顶,那么什么都不干。
最后把栈里的元素从底到顶输出作为结果。
容易发现,这样我们获得就是原排列的一个上升子序列,但是可能会失去太多的元素,比如假如我们要排序 [5,1,2,3,4],我们最后只得到了 [5]。
于是 YQH 进行了改进,现在排序变成这样一个过程:
假设我们要排序的序列是 a1,2,…,n,那么维护一个初始为空的栈,然后从 1 到 n 枚举 i:
假如 ai 比栈顶严格大或者栈为空,那么把 ai 加入栈中。
否则,此刻有 ai 小于等于栈顶,那么有两种选择:把栈顶弹出并把 ai 加入栈中,或什么都不干。注意,你需要保证任意时刻,栈中的元素从底到顶严格单调上升。
最后把栈里的元素从底到顶输出作为结果。
比如现在我们要排序 [5,1,2,3,4],栈的变化是 []→[5]→[1]→[1,2]→[1,2,3]→[1,2,3,4]。
容易发现,最后栈的大小与排序时进行的选择有关。YQH 当然希望最后栈越大越好,于是她找到了你,希望你对于她给出的排列,求出最后栈大小的最大值。
输入格式
第一行一个正整数 n 表示排列长度。
第二行 n 个各不相同的整数表示排列。
输出格式
输出一个整数表示答案。
样例
输入1
5 5 1 2 3 4
输出1
4
输入2
6 1 6 5 2 3 4
输出2
4
其中一种栈的变化是 []→[1]→[1,6]→[1,5]→[1,2]→[1,2,3]→[1,2,3,4]。
输入3
5 4 5 1 2 3
输出3
2
唯一一种栈的变化过程为 []→[4]→[4,5]→[4,5]→[4,5]→[4,5]。
样例输入/输出 4
见下发文件中的 ex_sort4.in/ex_sort4.ans
。
样例输入/输出 5
见下发文件中的 ex_sort5.in/ex_sort5.ans
。
数据范围
子任务编号 | n≤ | 特殊限制 | 分值 |
---|---|---|---|
1 | 500 | 无 | 20 |
2 | 4000 | 50 | |
3 | 5×105 | A | 10 |
4 | B | 10 | |
5 | 无 | 10 |
特殊限制A:存在一个对原序列的划分 [l1,r1],[l2,r2],…,[lm,rm],其中 li+1=ri+1,l1=1,rm=n,使得 ∀j∈[li,ri],aj=ri−(j−li)。
特殊限制B:保证 ai 随机生成。
对于所有数据,保证 1≤n≤5×105。