分块入门题
注:题目来源为loj 数列分块入门 1~9
1.区间加法,单点查询
块维护ad_tag。
2.区间加法,区间查询小于某值的数字个数
每个块内排序,部分修改就全改一遍,重新排序;
查询时部分块搜索查找,整块lower_bound
3.区间加法,区间求前驱
每个块内排序,依然使用lower_bound
4.区间加法,区间求和
同上
5.区间开方,区间求和
由于一个数字最多被开5次就会被开成1,所以可以维护块内mx,若为1就不变,否则暴力枚举开方
6.单点插入,单点查询
为什么不使用神奇的平衡树呢
每块用一个vector存,若一个块的长插的超过了2len,则全部pop出来重构一下
7.区间加法,区间乘法,单点查询
多维护一个tag而已
8.区间查询某数的个数,并全部改为该数
若查询时该块没有tag(全部改为某数的tag),则暴力遍历。
为什么是正确的?
原来有sqrt(n)个没tag的,每一次操作最多会把2个块从有tag改为没tag的,所以暴力遍历块的复杂度是在O(nsqrt(n))的,其他部分自然也是n根n的。
9.区间查询众数
由于一段区间的众数一定为一段连续的整块区间(比如说第i个块到第j个块)的众数,或旁边散点内的每一个点,对于每个点维护vector,然后lower_bound一下。