在做这一题之前先看一道题:
给的一个长度为n的序列a,求最少需要改变a的数量,使得a序列非严格递增。
显然结果为:n-LIS,(因为最后一定有些数是不变的,我们让不变的数尽量长,则必须让不变的数满足最终序列的性质即:非递减)
如果把非严格改成严格递增呢?
我们依然用上面的思路:让不变的序列尽量长,即满足最终序列,最终序列是严格递增序列,由于是整数,则对于:j>i,必须满足a[j]>a[i].且a[j]-a[i]>=j-i. 这样才能保证中间变化的数有解。
为了方便我们对上面的式子变化一下:a[j]-j>=a[i]-i. 为了方便: 我们刚开始让a[i]-=i,最终得到的序列就只需要满足j>i,a[j]>a[i],即可,即:满足a序列非严格递增即可。这就回到了第一个问题,直接求即可。
知道上面的经典例题后,我们来看这道题就非常简单了:
首先比较显然的思路:
对于每段b[i-1],b[i],我们把它看成一个区间,求一次结果。最后累加即可。若有一个区间a[R]-a[L]>R-L,则说明无法构造成功,输出-1即可。为了方便可在首尾加上两个哨兵节点。
另外:对于每段区间L,R。我们求得是R-L-1-LIS。
其中LIS是必须要包括a[L],和a[R]的。所以在nlogn求LIS的过程中我们需要改动一下:
首先我们要对nlogn求LIS的过程比较熟练:
dp[i]表示长度为i的非严格递增子序列结尾最小值为