题目: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 :直接线段树不行的时候想想分块 因为 分块的适用面往往更广 因为毕竟是暴力。