树状数组优化LIS ? 不要以为树状数组能简单的维护最大值

前面几天又看了一下树状数组,突然发现树状数组维护最大值其实没有想象中的简单。

以前一直用树状数组优化LIS问题,想当然的以为树状数组可以很方便的维护前缀最大值,

细想才发现这个思路是有问题的

这是优化LIS的树状数组的更新函数

void modify(int x, int pos) {
    while(pos<=N) {
        C[pos]=max(C[pos], x);//x只有比pos处的数大才会修改,而不是无条件修改
        pos+=lowbit(pos);
    }
}

可以发现事实上这并不是一般意义上的无条件修改

x只有比pos处的数大才会修改,显然这对于优化LIS是没有问题的

但对于一般的 修改-询问类的问题要多加小心,因为可能是不适用的

比如:对于a[5]=5, a[6]=6, 则b[5]=5, b[6]=6

现将a[6]修改为4,则按照前面的做法,b[6]是不变的,这是不对的

至于树状数组怎么维护区间最大,其实比较复杂,个人认为不如线段树直观