树状数组优化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]是不变的,这是不对的

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值