分块算法

    题目:http://www.qscoj.cn/#/contest/show/209

虽然早就知道分块的思想,但是却没有自己做过,这算第一次分块题,题目大意是区间修改,值查询(这里的查询查某个值是否存在于当前数组中如果存在找到其最前或最后的位置),数据范围询问和数组个数均为1e5  这个题我并没想到怎样用线段树进行查询 因为线段树处理的是某个位置的值或者某个区间的值问题 此题也无法用区间最大值二分 所以考虑一下分块 分块的复杂度一般是n*√n

因为我们可以把【1,n】分成√n 块 每一块中则会有√n个元素 那么每一个区间更新等价于对完整的块更新和剩余下来单个元素的更新

考虑一下最差的情况,完整块最多有√n个,残留的单个元素最多2√n个(两头) 所以只用√n的复杂度完成更新。

接下来思考查询有两种方式:1。vector 效率高 2.mutiset  由于要查询和维护这两个数据结构要用logn的复杂度

所以总体复杂度要乘logn     

ps :直接线段树不行的时候想想分块 因为 分块的适用面往往更广 因为毕竟是暴力。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值