树状数组优化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]是不变的,这是不对的
至于树状数组怎么维护区间最大,其实比较复杂,个人认为不如线段树直观