首页 > 其他分享 >分块

分块

时间:2024-11-23 11:22:39浏览次数:6  
标签:分块 int sqrt 查询 修改 size

分块

简单理解一下,分块就是优雅的暴力。

分块的分类

  1. 静态分块(只做查询,预处理):

静态分块指的是放一些关键点,预处理关键点到关键点的信息,来加速查询的,不能支持修改。

目前认为,如果可以离线,静态分块是莫队算法的子集。

  1. 动态分块(支持修改和查询):

动态分块指的是把序列分为一些块,每块维护一些信息,可以支持修改。

分块基础

对于一个长度为 \(n\) 的序列,我们可以分为一些块,每块维护一些信息。

我们把每次操作完整覆盖的块定义为“完整的块”。

把每次操作不完整覆盖的块定义为“不完整的块”。

每次操作最多经过 \(O(\sqrt{n})\) 个块,以及 \(O(1)\) 个零散块。

所以我们可以 \(O(1)\) 维护整块信息,\(O(\sqrt{n})\) 查询零散块信息。

这样就达到了 \(O(m\sqrt{n})\) 的复杂度。

分块的本质

一个度为 \(\sqrt{n}\),只有 \(3\) 层的树。

每次修改只需要更新 \(\sqrt{n}\) 个 size 为 \(1\) 的节点,以及 \(2\) 个 size 为 \(\sqrt{n}\) 的节点。

注意到我们不用维护那个 size 为 \(n\) 的根节点的信息。

建立分块序列

\(B\) 表示每一块有多大,\(num\) 表示一共有多少块,\(belong_i\) 表示原序列中的第 \(i\) 个元素属于哪一块,\(l_i\) 和 \(r_i\) 表示第 \(i\) 块的左右边界。

B = sqrt(n);
num = n / B + (n % B != 0);
for (int i = 1; i <= n; i ++ ) {
    belong[i] = (i - 1) / B + 1;
    l[i] = (i - 1) * B + 1;
    r[i] = i * B;
}
r[num] = n;

区间修改

for (int i = l; i <= min(r, belong[l] * B); i ++ ) a[i] += c;
if (belong[l] != belong[r]) for (int i = (belong[r] - 1) * B + 1; i <= r; i ++ ) a[i] += c;
for (int i = belong[l] + 1; i < belong[r]; i ++ ) add[i] += c;

单点查询

a[i] + add[belong[i]];

区间查询

for (int i = l; i <= min(r, belong[l] * B); i ++ ) res += a[i] + add[belong[l]];
if (belong[l] != belong[r]) for (int i = (belong[r] - 1) * B + 1; i <= r; i ++ ) res += a[i] + add[belong[r]];
for (int i = belong[l] + 1; i < belong[r]; i ++ ) res += sum[i] + add[i] * B;

标签:分块,int,sqrt,查询,修改,size
From: https://www.cnblogs.com/zla2012/p/18564253

相关文章

  • 408数据结构-折半查找,分块查找 自学知识点整理
    前置知识:查找的基本概念折半查找折半查找又称二分查找,它仅适用于有序的顺序表。因个人习惯,下文均用二分代替折半。二分查找的基本思想:首先将给定值ke......
  • 【JS】requestIdleCallback实现分块执行
    点击按钮后,执行一个耗时较长的dom操作,页面很长时间没有响应,给用户一种卡死的现象<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width,initial-scale=1.0">&......
  • 张量矩阵乘法分块乘法概述
    张量矩阵乘法分块乘法概述介绍一下矩阵计算相关的内容,从最基本的算法,到Cutlass这些线性代数模版库,特别是Layout代数相关的内容,再逐渐细化到一些硬件实现访存优化和一些算子融合。6.3.1GEMM概述1.GEMM定义对于一个矩阵乘法,定义如下: (6-1)一个矩阵乘法定义,如图6-26......
  • P3863 序列(分块)
    感觉是一个比较厉害的trick,并且从来没见过,记录一下。题意给定\(n\)个数和\(q\)次操作:1lrx:区间\([l,r]\)加\(x\)。2xv:查询在询问之前有多少时刻\(a_x\gev\)。一次操作定义为一个时刻,初始为\(0\)时刻。\(n,q\le10^5\)分析如果\(x\ge0\),那么\(a_i\)的......
  • P3730 曼哈顿交易(经典题,莫队+值域分块)
    记录这一类很典的题目。题意给定\(n\)个数,\(q\)次询问区间\([l,r]\)内出现次数第\(k\)小的数的出现次数。若区间内不同数的个数小于\(k\)输出-1。\(n,q\le10^5\)。分析发现正常的数据结构以及分块都很难维护这种信息,考虑莫队。莫队加入数时,我们需要更新一个数的......
  • 分块式内存管理理论理解
    一,引入             分块式内存管理是一种内存管理策略,它将内存划分为若干个大小相等的块(称为“分区”、“段”或“块”),然后为不同的程序分配这些块。这种策略可以有效地解决内存碎片问题,提高内存利用率。分块式内存管理通常有两种实现方式:固定大小块和可变......
  • 语义分块:改进 AI 信息检索
    RAG系统及其挑战检索增强生成的流行是有充分理由的。它允许AI系统通过结合信息检索和语言生成来回答问题。标准的RAG管道通过摄取数据、检索相关信息并使用它来生成响应来实现这一点。然而,随着数据变得越来越复杂,查询也越来越复杂,传统的RAG系统可能会面临限制。这就是语......
  • 学习笔记:数论分块
    数论分块1.0可以快速计算一些含有除法向下取整的和式(形如$\sum_{i=1}^ng(i)\left\lfloor\frac{n}{i}\right\rfloor$)。2.0引理1:\(\left\lfloor\frac{n}{i}\right\rfloor\)的取值最多只有\(2\times\sqrtn\)种。证明:对于\(i\le\left\lfloor\sqrtn\rig......
  • 数论分块扩展
    【OI-wiki#5805】feat(math/number-theory/sqrt-decomposition.md):增加数论分块的拓展&改动部分格式以计算含有\(\left\lfloor\sqrt{\frac{n}{d}}\right\rfloor\)的和式为例。考虑对于一个正整数\(n\),如何求出集合\[S=\left\{\left\lfloor\sqrt{\frac{n}{d}}\right\rf......
  • 分块莫队
    莫队序言其实我不是很赞成把分块和莫队放到一起的(可能是我太菜了),原本这周先学的树上合并,树分治扫描线那些的,但是没怎么懂,先写一个记忆最新的吧。简介莫队算法是由莫涛提出的算法,莫队算法可以解决一类离线区间询问问题,适用性极为广泛。同时将其加以扩展,便能轻松处理树上路径询......