当前位置: 首页 > news >正文

浅谈根号分治与分块

文章目录

    • 1. 根号分治
      • 哈希冲突
    • 2. 线性分块
      • 引入
      • 教主的魔法
      • [CQOI2011] 动态逆序对
      • [国家集训队] 排队
      • [HNOI2010] 弹飞绵羊
      • 蒲公英

1. 根号分治

哈希冲突

题目1

n n n 个数, m m m 次操作。操作 1 为修改某一个数的值,操作 2 为查询所有满足下标模 x x x 等于 y y y 的数之和。

先来看两个暴力算法:

  • 算法 1:

    修改:直接修改。时间复杂度 O ( 1 ) O(1) O(1)
    查询:枚举下标模 x x x 等于 y y y 的数的和。时间复杂度 O ( n ) O(n) O(n)

  • 算法 2:

    先预处理出 f ( i , j ) f(i,j) f(i,j) 表示下标模 i i i 等于 j j j 的数之和。时间复杂度 O ( n 2 ) O(n^2) O(n2)
    修改:修改所有 i i i 下的 f ( i , x m o d i ) f(i,x\bmod i) f(i,xmodi)。时间复杂度 O ( n ) O(n) O(n)
    查询:直接查询。时间复杂度 O ( 1 ) O(1) O(1)

容易想到划定一个界限 B B B 选择使用的算法。

x x x 较大时,即 x > B x>B x>B 时,算法 1 的查询次数会较小,复杂度 O ( N B ) O(\frac N B) O(BN)

当我们仅用算法 2 处理模数 i i i 较小的情况时,即 i ≤ B i\le B iB 时,算法 2 复杂度会较低,预处理复杂度 O ( B 2 ) O(B^2) O(B2),修改复杂度 O ( B ) O(B) O(B)

总时间复杂度 O ( B 2 + m ( N B + B ) ) O(B^2+m(\frac N B + B)) O(B2+m(BN+B))。在 B = N B=\sqrt N B=N 时复杂度最低。

代码


2. 线性分块

引入

题目

给定 n n n 个数 a [ 1.. n ] a[1..n] a[1..n] m m m 次操作,区间修改,区间查询。

我们将数列分段,设块长为 B B B

对于区间 [ L , R ] [L,R] [L,R] 的询问:

  • L , R L,R L,R 在同一个块内,直接暴力枚举 [ L , R ] [L,R] [L,R] 统计。

  • L , R L,R L,R 不在同一个块内,则将 [ L , R ] [L,R] [L,R] 分成左右两个散块以及中间若干整块。对于每个整块,我们事先预处理出每个整块的 b i = ∑ a i b_i=\sum a_i bi=ai。对于散块,暴力统计。

    时间复杂度至多 O ( B + N B ) O(B+\frac N B) O(B+BN)

对于区间 [ L , R ] [L,R] [L,R] 的修改:

  • L , R L,R L,R 在同一个块内,直接暴力枚举 [ L , R ] [L,R] [L,R] 修改。

  • L , R L,R L,R 不在同一个块内,则将 [ L , R ] [L,R] [L,R] 分成左右两个散块以及中间若干整块。对于每个整块,我们修改整块的 b i b_i bi。对于散块,暴力修改。

    时间复杂度至多 O ( B + N B ) O(B+\frac N B) O(B+BN)

B = N B=\sqrt N B=N 时最优。

代码


教主的魔法

题目

给定 n n n 个数, m m m 次操作。区间修改,区间查询有多少个数 ≥ k \ge k k

设块长为 B B B

  • 对于区间 [ L , R ] [L,R] [L,R] 的询问:

    与上题基本一样,但是我们需要快速统计出整块中有多少个 ≥ k \ge k k 的数。考虑将所有整块内元素排序后二分查找。

    时间复杂度至多 O ( B + N B log ⁡ B ) O(B+\frac N B \log B) O(B+BNlogB)

  • 对于区间 [ L , R ] [L,R] [L,R] 的修改:

    修改整块并不会改变排序后的相对位置,记录标记表示增加的量即可。

    而对于散块的修改,可能会改变所在块的相对位置,我们暴力修改后重新排序。

    时间复杂度至多 O ( B + log ⁡ B + N B ) O(B +\log B + \frac N B) O(B+logB+BN)

复杂度最低时, B B B 的大小应该为 N \sqrt N N 左右(略大于 N \sqrt N N ,取 N \sqrt N N 也能过)。

代码

同类题 :Array Transformer (附代码)


[CQOI2011] 动态逆序对

题目

给定 n n n 个数的一个排列, m m m 此操作。每次删一个数,问删前逆序对个数。

删除一个数后,逆序对数量会减少这个数的贡献。第 i i i 个数的贡献为 [ 1 , i ) [1,i) [1,i) 中比 i i i 大的个数加上 ( i , n ] (i,n] (i,n] 中比 i i i 小的个数。和上一题类似,可以用二分或者树状数组解决。

代码


[国家集训队] 排队

题目

给定 n n n 个数 h 1 . . . h n h_1...h_n h1...hn m m m 次操作。每次操作交换两个数,问操作前的逆序对个数。

和上一题一样,考虑两个数交换前和交换后的贡献。

代码

双倍经验 :Anton and Permutation (附代码)


[HNOI2010] 弹飞绵羊

题目

题意见题面。

考虑预处理出 s t e p [ x ] step[x] step[x] 表示从 x x x 处开始弹几步能弹到下一块, p o s [ x ] pos[x] pos[x] 表示从 x x x 开始第一次弹到下一块的位置在哪里。

查询:每次跳到下一块,复杂度为 O ( N B ) O(\frac N B) O(BN)
修改:记修改点为 x x x ,所在块为 B B B ,块对应区间为 [ L B , R B ] [L_B,R_B] [LB,RB] ,那么可能会对 [ L B , x ] [L_B,x] [LB,x] 上的点的 p o s pos pos s t e p step step 造成影响。复杂度 O ( B ) O(B) O(B)

B = N B=\sqrt N B=N

代码

双倍经验 :Holes (附代码)


蒲公英

题目

静态求区间众数,强制在线。

分析:

  • n ≤ 4 × 1 0 4 , a ≤ 1 0 9 n\le 4 \times 10 ^ 4, a\le 10^9 n4×104,a109 ,考虑离散化。

  • 由于众数不满足一些性质(如可加性等),无法方便的用一些数据结构维护出来,考虑分块。

Solution

我们将序列分成 K K K 段,每段长度 N K \frac {N}{K} KN (左右)。

对于一次询问 [ l , r ] [l,r] [l,r] ,将其划分为若干整块和两块散块:
在这里插入图片描述

那么,答案一定为蓝色区间的众数或者红色区间出现过的数字。

考虑预处理出任意 i i i j j j 块间的众数,来快速求出蓝色区间的众数,预处理时间复杂度 O ( K 2 N ) O(K^2N) O(K2N)

// cnt[i][j][x] : x 在 i 到 j 块间出现的次数
// num[i][j] : i 到 j 块间的众数for(int i=1; i<=n; i++){int B = ceil((1.0 * i) / (1.0 * len));belong[i] = B;cnt[B][B][a[i]] ++ ;}for(int i=1; i<=n; i++){int B = ceil((1.0 * i) / (1.0 * len));if(cnt[B][B][a[i]] == cnt[B][B][num[B][B]] && a[i] < num[B][B]) num[B][B] = a[i];if(cnt[B][B][a[i]] > cnt[B][B][num[B][B]]) num[B][B] = a[i];}for(int i=1; i<=k; i++)for(int j=i+1; j<=k; j++)for(int x=1; x<=tot; x++){cnt[i][j][x] = cnt[i][j-1][x] + cnt[j][j][x];if(cnt[i][j][x] == cnt[i][j][num[i][j]] && x < num[i][j]) num[i][j] = x;if(cnt[i][j][x] > cnt[i][j][num[i][j]]) num[i][j] = x;}

对于每次询问,我们 O ( 1 ) O(1) O(1) 求蓝色区间的众数, O ( N K ) O(\frac N K) O(KN) 枚举红色区间的数,计算 [ l , r ] [l,r] [l,r] 的众数,询问时间复杂度 O ( M N K ) O(M \frac N K) O(MKN)

总时间复杂度 O ( N K 2 + M N K ) O(NK^2+M \frac N K) O(NK2+MKN),如果我们认为 N , M N,M N,M 同构,那么 K = N 1 3 K=N^{\frac 1 3} K=N31 时复杂度最低。

代码


相关文章:

浅谈根号分治与分块

文章目录 1. 根号分治哈希冲突 2. 线性分块引入教主的魔法[CQOI2011] 动态逆序对[国家集训队] 排队[HNOI2010] 弹飞绵羊蒲公英 1. 根号分治 哈希冲突 题目1 n n n 个数&#xff0c; m m m 次操作。操作 1 为修改某一个数的值&#xff0c;操作 2 为查询所有满足下标模 x x x …...

(OpenAI)ChatGPT注册登录常见问题错误代码及其解决方法

在使用 ChatGPT 的时候我们可能会碰到一些错误的代码&#xff0c;本文统一来介绍一下每一种错误以及解决方法。 错误代码1. 不能在当前国家使用 出现场景&#xff1a;一般在注册或登录的时候会出现。 原因&#xff1a;主要是ChatGPT检测到当前访问所在的地区不允许访问导致。 …...

MySQL主从复制、读写分离(MayCat2)实现数据同步

文章目录 1.MySQL主从复制原理。2.实现MySQL主从复制&#xff08;一主两从&#xff09;。3.基于MySQL一主两从配置&#xff0c;完成MySQL读写分离配置。&#xff08;MyCat2&#xff09; 1.MySQL主从复制原理。 MySQL主从复制是一个异步的复制过程&#xff0c;底层是基于Mysql数…...

Linux 云服务器好用吗?(解读Linux云服务器的特点优势)

​  如今&#xff0c;云计算越来越受欢迎&#xff0c;许多公司正在将业务转移到那里。企业向云过渡的主要原因是它提供的众多服务&#xff0c;包括安全和充足的存储、数据库、服务器和其他关键元素。 作为相对前|沿的技术之一&#xff0c;云建立在虚拟服务器上。Linux 服务器…...

研读Rust圣经解析——Rust learn-8(match,if-let简洁控制流,包管理)

研读Rust圣经解析——Rust learn-8&#xff08;match,if-let简洁控制流&#xff0c;包管理&#xff09; matchother和占位符_区别 easy matchenum matchno valuematch inner Option matchmore better way if-let整洁控制包管理模块(mod)拆分声明modpub公开use展开引用拆解模块结…...

G8期刊《全体育》期刊简介及投稿要求

G8期刊《全体育》期刊简介及投稿要求 《全体育》是由湖南体育产业集团有限公司主管、体坛传媒集团股份有限公司主办、中教体育 出版发行的体育综合性期刊。 主管&#xff1a;湖南体育产业集团有限公司 主办&#xff1a;体坛传媒集团股份有限公司 国内刊号&#xff1a;CN4…...

数据结构和算法学习记录——层序遍历(层次遍历)、二叉树遍历的应用(输出二叉树中的叶节点、求二叉树的高度、二元运算表达式树及其遍历、由两种遍历序列确定二叉树)

目录 层序遍历 思路图解 代码实现 二叉树遍历的应用 输出二叉树中的叶节点 代码实现 求二叉树的高度 思路图解 代码实现 二元运算表达式树及其遍历 由两种遍历序列确定二叉树 层序遍历 层序遍历可以通过一个队列来实现&#xff0c;其基本过程为&#xff1a; 先根…...

【Neo4j数据库】图数据库_Neo4j增加节点(关系)、查询、删除数据库等操作解析(Cypher语句)

【Neo4j数据库】图数据库_Neo4j增加节点&#xff08;关系&#xff09;、查询、删除操作解析&#xff08;Cypher语句&#xff09; 文章目录 【Neo4j数据库】图数据库_Neo4j增加节点&#xff08;关系&#xff09;、查询、删除操作解析&#xff08;Cypher语句&#xff09;1. 介绍2…...

Linux移动文件和文件夹(目录)命令

命令mv 英文move 翻译移动 mv命令可以移动文件或文件夹&#xff08;目录&#xff09;&#xff0c;也可以重命令&#xff08;覆盖&#xff09;文件。 1. 移动文件/重命名 单纯地移动某一个文件直接使用&#xff1a; mv <源文件名称/地址> <新文件名称/地址>这个方法…...

Pandas的应用-5

Pandas是一个强大的数据处理库&#xff0c;它提供了高性能、易于使用的数据结构和数据分析工具。本文将介绍Pandas常用的数据结构和常用的数据分析技术&#xff0c;包括DataFrame的应用、窗口计算、相关性判定、Index的应用、范围索引、分类索引、多级索引以及日期时间索引。 …...

java继承类怎么写

继承类是通过把父类的方法和属性继承到一个类中&#xff0c;而子类的方法和属性是子类自己定义的。 Java中有一个很重要的概念叫做继承&#xff0c;这也是 Java语言的精髓所在。Java语言提供了一种机制&#xff0c;叫做派生类。在 Java中&#xff0c;如果没有实现了某个派生类方…...

面向对象程序设计

OOP 【面向对象程序设计】&#xff08;OOP&#xff09;与【面向过程程序设计】在思维方式上存在着很大的差别。【面向过程程序设计】中&#xff0c;算法是第一位的&#xff0c;数据结构是第二位的&#xff0c;这就明确地表述了程序员的工作方式。首先要确定如何操作数据&#…...

Linux 用户身份切换(su,sudo)

文章目录 Linux 用户身份切换su使用案例 sudo使用案例 visudo与/etc/sudoers单一用户可使用root所有命令&#xff0c;与sudoers文件语法利用wheel用户组以免密码的功能处理visudo有限制的命令操作通过别名创建visudosudo的时间间隔问题sudo搭配su的使用方式 Linux 用户身份切换…...

求倒置数问题

文章目录 求倒置数程序设计程序分析求倒置数 【问题描述】数组A【0,…,n-1】是一个n个不同整数数构成的数组。如果i<j,但是A[i]〉A[j],则这对元素(A[i],A[j])被称为一个倒置(inversion)。设计一个O(nlogn)算法来计算数组中的倒置数量 【输入形式】输入两行,第一行…...

sed(学习)

1、清除环境变量 ​​​​​​profile~/.bash_profile sed -i s#export LD_LIBRARY_PATH.*##g $profile 2、设置环境变量(替换值) sed -i s#export LD_LIBRARY_PATH.*#export LD_LIBRARY_PATH/opt/testlinux/lib#g ~/.bash_profile 3、修改配置文件 sdk_dir/root/test log_dir/…...

B - GCD Subtraction

文章目录 AtCoder Regular Contest 159B - GCD Subtraction AtCoder Regular Contest 159 B - GCD Subtraction 问题&#xff1a;每次A,B都减去gcd(A,B)&#xff0c;求其中一个减到0至少需要多少次主要思路&#xff1a; 首先第一步应该想到每次减去的数&#xff0c;先减去的数…...

解决Failed to load ApplicationContext问题的思路

中文翻译&#xff1a; 加载ApplicationContext失败 第一步&#xff1a;首先检查测试类的注解 以及 依赖 SpringBootTest <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scop…...

基于CAMX大气臭氧来源解析模拟与臭氧成因分析实践技术应用

查看原文>>>基于CAMX大气臭氧来源解析模拟与臭氧成因分析实践技术应用 目录 专题一、大气臭氧污染来源及成因分析技术讲解&#xff1b;CAMx模式初识及臭氧来源解析模拟本地案例配置说明 专题二、CAMx模式编译安装及空气质量模拟案例配置 专题三、CAMx扩展和探测工…...

异常的讲解 (1)

目录 异常入门的案例 异常介绍 基本概念 异常的小结 常见的运行时异常 1.NullPointerException空指针异常 2.ArithmeticException数学运算异常 3.ArraylndexOutOfBoundsException数组下标越界异常 4.ClassCastException类型转换异常 5.NumberFormatException数字格式不…...

Prometheus - Grafana 监控 MySQLD Linux服务器 demo版

目录 首先是下载Prometheus 下载和安装 配置Prometheus 查看监控数据 监控mysql demo 部署 mysqld_exporter 组件 配置 Prometheus 获取监控数据 -------------------------------------- 安装和使用Grafana 启动Grafana -------------------------------------- 配…...

应届生,实力已超6年,太卷了!

你好&#xff0c;我是田哥 今晚上&#xff0c;给一位朋友做模拟面试&#xff0c;原本说好的90分钟左右&#xff0c;结果整了2个多小时。 很多人估计也很好奇&#xff0c;我们这两个多小时聊聊什么&#xff0c;下面我给大致总结一下&#xff1a; 面试技巧 面试中&#xff0c;我们…...

0-1背包问题

文章目录 0-1背包问题JavaPython0-1背包问题 【问题描述】 给定n种物品和一背包。物品i的重量是wi,其价值为vi,背包的容量为C。问应如何选择装入背包的物品,使得装入背包中物品的总价值最大? 【输入形式】 第一行输入物品的个数n和背包容量C。 第二行输入每个物品的价值v[i…...

VUE前端项目环境搭建

背景&#xff1a; 想要使用vue搭建一个前端项目&#xff0c;写个小网站练练手&#xff0c;因为没有前端经验&#xff0c;所以从网上找了一个vue得开源模板使用&#xff0c;经过一番挑选选中了字节公司花裤衩大佬开源得项目&#xff0c;地址如下&#xff1a; 开源项目地址&…...

VMware安装Win2000安装程序闪退重启等问题的解决方法

VMware安装Win2000安装程序闪退重启等问题的解决方法 【症状】 1、比较新的VMware版本如16.2.5&#xff0c;Win2000安装时&#xff0c;安装程序在安装Distributed Transaction Coordinator时闪退重启 2、比较新的VMware版本如17.0.1&#xff0c;还会发生显示跳跃性卡顿的现象…...

【id:45】【20分】A. Equation(类与对象+构造)

题目描述 建立一个类Equation&#xff0c;表达方程ax2bxc0。类中至少包含以下方法&#xff1a; 1、无参构造&#xff08;abc默认值为1.0、1.0、0&#xff09;与有参构造函数&#xff0c;用于初始化a、b、c的值&#xff1b; 2、set方法&#xff0c;用于修改a、b、c的值 3、ge…...

数据库事务

什么是事务 在数据库中&#xff0c;事务&#xff08;Transaction&#xff09;是指一组数据库操作&#xff0c;这些操作要么全部成功执行&#xff0c;要么全部失败回滚&#xff0c;是保证数据库操作一致性的基本单位。事务具有原子性&#xff08;Atomicity&#xff09;、一致性…...

Macbook(苹果电脑) VSCode 创建简单c++程序 配置C++开发环境

1.打开 Terminal 终端&#xff08;Command空格&#xff0c;输入Terminal&#xff09;。 1.1 输入如下指令&#xff0c;查看是否显示版本信息。 clang --version 1.2 如果出现版本信息&#xff0c;则跳过&#xff0c;否则输入 xcode-select --install 2. 为 VS Code 安装插件 …...

如何使用 Matlab 构建深度学习模型

深度学习已经成为了AI领域的热门话题&#xff0c;相信很多人都想学习如何构建深度学习模型&#xff0c;那么&#xff0c;我们就一起来看看如何使用Matlab构建深度学习模型。 首先&#xff0c;我们需要准备好Matlab的环境。Matlab是一款非常强大的数学计算软件&#xff0c;它提…...

PDF怎么转CAD文件?(免费!高效转换方法汇总)

一般而言&#xff0c;PDF图纸是不能修改的。若需修改&#xff0c;则需将PDF转CAD&#xff0c;此时如何满足PDF转CAD的需求呢&#xff1f;今天&#xff0c;我将教你两种免费的PDF转CAD的方法&#xff0c;助力高效办公。 1.本地软件转换法 这是用本地软件转换方法&#xff0c;支…...

经历了野蛮生长之后,新科技或许已经抵达了全新的临界点

跳出仅仅只是以概念和营销的方式来定义元宇宙&#xff0c;真正找到元宇宙与现实商业之间的桥接&#xff0c;让元宇宙可以在真实实践上得到复现&#xff0c;才是保证元宇宙的发展可以进入到一个全新发展阶段的关键所在。归根到底&#xff0c;我们还是要找到元宇宙落地的正确的方…...