分块学习笔记

笔记——分块
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吸引半径的磁石必定在这一块的开头部分。
   
   找到当前这一块第一个不能被吸引的磁石,把该块的开头移到此处,以免已经被吸引的磁石被重复扫描。

原文地址:https://www.cnblogs.com/THWZF/p/10301059.html