题目: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 :直接线段树不行的时候想想分块 因为 分块的适用面往往更广 因为毕竟是暴力。
本文介绍了一道关于区间修改和值查询的问题,通过分块算法来解决。详细解释了如何将数组划分为多个小块,以及如何高效地进行区间更新和查询操作。探讨了使用vector或multiset数据结构来辅助实现,并分析了算法的时间复杂度。
1504

被折叠的 条评论
为什么被折叠?



