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

  • 相关阅读:
    STM32F4 SPI双机通讯调试总结
    Altium Designer (DXP) 复制粘贴,放器件 出错报异常的原因
    C++中一个0xC0000005访问冲突问题
    将Windows 7安装到移动固态硬盘(U盘)
    Delphi 的TStringBuilder防止服务器内存碎片化
    Delphi XE5的Android开发平台搭建
    利用RTTI实现Delphi的多播事件代理研究
    博客即将同步至 OSCHINA 社区
    用太极拳讲分布式理论,真舒服!
    记录一次C#调用Delphi编写Dll程序过程
  • 原文地址:https://www.cnblogs.com/Renyi-Fan/p/8117148.html
Copyright © 2011-2022 走看看