zoukankan      html  css  js  c++  java
  • 分块

    分块

    最近突发奇想,到B站上看qscqesze神犇的每周算法讲堂,于是便学习了分块这个算法。

    分块是一个很暴力的算法,按照某大神的说法,一般的区间问题都可以用他来解决,没有100分也有80分(一般会有80分,运气好有100分)。

    分块是一个很暴力的算法,它可以完成几乎所有区间更新和区间查询问题,但效率相对于线段树等数据结构要差一些。

    思想

    对于一个长度为n的序列,我们可以讲其中的元素分为M个连续的子序列,每块的长度自然就为N/M。我们在更新一段区间[l,r]是,可以先更新l到l所在块的右端点和r所在块的右端点到r。即下图中红色的区域,每块中最多有N/M个元素,所以这一操作的复杂度的为N/M。

    然后我们在成段更新刚才更新的块中间的那些块(即上图中红色区域中间的那些块),这些块最多为N块,所以这一操作的复杂度为M。

    总操作的复杂度即为M+N/M,根据均值不等式可知,M=sqart(n)时复杂度最新。

    建立分块序列

    block代表每一块有多大,num代表一共有几块,belong【i】代表原序列中第i个元素在第几块,l[i]代表第i块的左端点,r[i]代表第i块的右端点。

    具体怎么算我就不解释了,自己根据代码YY吧。

    具体的查询和更新操作就不张贴代码了,因为这些因题目的要求而异。

    最后附上 BZOJ 3343 /luogu 2801 教主的魔法的代码

  • 相关阅读:
    SpringBoot2.1.6 整合CXF 实现Webservice
    一次线上CPU高的问题排查实践
    SpringBoot整合升级Spring Security 报错 【The request was rejected because the URL was not normalized】
    Web服务器☞Apache VS Nginx
    PHP 遍历一个文件夹下所有文件和子文件夹的方法
    PHP 使用 header 方式实现文件下载功能
    PHP gd 库添加 freetype
    MySQL varchar 最大长度,text 类型占用空间剖析
    S.O.L.I.D: PHP 面向对象设计的五个基准原则
    PHP不重新编译,单独添加模块扩展的方法
  • 原文地址:https://www.cnblogs.com/Renyi-Fan/p/8117148.html
Copyright © 2011-2022 走看看