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 教主的魔法的代码

  • 相关阅读:
    mysql系列~mysqldump使用技巧
    mysql系列~logrotate
    最详细的经典双向电平转换电路的工作原理图文分析
    《USB应用分析精粹:从设备硬件、固件到主机程序设计》已经完稿
    Windows x86环境下使用QEMU安装arm架构银河麒麟V10操作系统
    不动产测绘包含哪些内容
    java问题收集
    java调用接口(rest-assured)
    java调用接口(okhttp )
    testng+allure
  • 原文地址:https://www.cnblogs.com/Renyi-Fan/p/8117148.html
Copyright © 2011-2022 走看看