• 分块


    分块

    最近突发奇想,到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 教主的魔法的代码

  • 相关阅读:
    pycharm的常规使用
    python-引用/模块
    6-4 函数
    5-21文件的操作
    5-21python数据类型
    python-基础
    5-7接口测试工具之jmeter的使用
    接口测试基础
    把命令结果作为变量赋值
    shell变量子串
  • 原文地址:https://www.cnblogs.com/Renyi-Fan/p/8117148.html
Copyright © 2020-2023  润新知