CodeForces

(和南京那题很像,比赛的时候就两个队A了。我们队找到了思路,但是花了1个多小时没有写出来,emmmm,我的锅,当时线段树写丑了。

题意:给定数组,Q次询问,假设把第i个大小hi改为b,求最长上升子序列LIS,(Q次询问是独立的)。

思路:对于原来的数组,假设ans=LIS。那么改一个数字,ans1或=ans,或者=ans-1,或者ans+1。

(LIS1i表示以i为终点的最长上升子序列。LIS2i表示以i为起点的最长上升子序列。

考虑两种情况,用到b和不用b。

1,用到b,那么找左边hi<b而且LIS1最大,找到右边hi>b而且LIS2最大。

2,不用b,那么验证是否原来的所有最长LIS都经过i。

      对于1,我们需要满足找到j<i,hj<hi,的最大LIS1。我们建立N棵线段树,每棵树记录对应高度的LIS1。然后在1到j-1这几棵线段树上去找高度在1到hi-1范围的最大值。 转化一下,这N棵树可以转化为主席树。没棵树从root[j]跑,去更新对应高度的最大值(高度离散化)。   

原文地址:https://www.cnblogs.com/hua-dong/p/9107854.html