笔记——分块
1. 时间复杂度:O(n*sqrt(n))2. 基本思想:分成sqrt(n)块,对每个区间进行朴素操作【例1】A Simple Problem with Integers (POJ3468)①每一块上记录sum(区间和),标记add,左右端点[第i块的左端点为(i-1)×sqrt(n)+1, 右端点为i×sqrt(n)]。②标记当前元素属于哪一块,pos[i]=j表示原序列第i个元素在第j块中。③Change操作:把数列中l~r的每个数都加d <1>如果l和r在同一块内,则直接暴力把l~r的每个数加d,同时更改这一块的sum值。 <2>设l在第p块内,r在第q块内。对于中间完整的每一块,更改标记add+=d;对于不完整的第p和第q块,同<1>暴力修改。 ④Question操作:查询l~r的区间和 <1>如果l和r在同一块内,则直接把l~r的每个数加起来,记得修改标记。 <2>如果l在第p块内,r在第q块内。对于中间完整的每一块,直接把sum相加,同时还要加上标记;对于不完整的第p和第q块,同<1>暴力相加。 【例2】磁力块 (CH#46A) ①磁石吸引条件包含两个维度,即质量<=磁力,距离<=吸引半径。 ②建立一个队列,最初仅包含磁石L,每次从队头取出磁石,把所有能被吸引的磁石加入队尾。 ③把N块磁石按照质量从小到大排序,分成sqrt(n)块,然后在每块内部,再按照距离从小到大排序。 ④每次用队头磁石(设为H)吸引其他磁石时,根据排序的结果,一定存在一个整数k,满足: <1>第1~k-1块中的磁石质量都不大于H的磁力。 <2>第k+1块之后的磁石质量都大于H的磁力,不可能被吸引。 ⑤因为每一块内部已经按照距离从小到大排序,所以第1~k-1块中与初始点距离小于H吸引半径的磁石必定在这一块的开头部分。 ⑥找到当前这一块第一个不能被吸引的磁石,把该块的开头移到此处,以免已经被吸引的磁石被重复扫描。