CodeForces - div1 -650D:Zip-line(主席树 占位)
(和南京那题很像,比赛的时候就两个队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]跑,去更新对应高度的最大值(高度离散化)。
It is your time to fight!