分块入门

我貌似和所有的数据结构都有些误会。。。。。。

在处理一些修改查询问题的时候,我们可以利用分治的思想,比如说把一个线性的数据不断分成一棵二叉树,也就是我们所说的线段树,这样我们就可以在logn的时限里做到修改和查询。同理我们也可以把数据分成一个只有两层的树(算上根节点三层),每个节点分成sqrt(该节点大小)个节点,这就是我们所说的分块了。

这里我们主要讲解分块的思想:

话不多说先上一张图:

 

如图,我们这就是一个分好块的结构。

那么,这个结构有个什么用呢?很明显,我们可以用它维护单点修改与查询,区间的修改,查询。。。

看上去有些眼熟,是不是,想起来了些什么?

没错,就是线段树那几个操作。那么现在我们继续,可以发现分块的修改和查询操作都是O(sqrt(n))的。那还要分块有个什么用??

我们先来看这么一道题:

我们刚开始看的时候可能觉得可以用数据结构实现,什么线段树主席树平衡树都可以想一想,不过一会你就会发现,它们都不可行,过了一会,你会发现有一种线段树套平衡树的方法或许可做,只不过代码复杂度很高,而且估计要调不短的时间吧。这个时候就是分块出场的时候了。

为什么这个题不能通过线段树实现,原因就在于第二个操作过于烦人,线段树维护的区间信息无法找出单点的,如果要查找一个区间中的所有点,无法得到一个让人满意的复杂度。那么为什么分块就可以令人满意了呢??

首先我们说明几个接下来经常会说的名词:

整块:查询范围内完全包括的块,也就是范围内第二层的块。

零散块:查询范围内除了整块其他的部分,是第三层的块,也就是一个一个的点。

接着声明几个变量:

那么我们再修改的时候,对于区间内所有的整块,我们O(1)的打上加法标记即可。

 

那么对于所有的零散块呢?

 我们发现,我们最多有两个部分的零散块,其中每个部分里最多有不超过sqrt(n)个点,我们直接暴力枚举下标修改即可,那么整个修改操作的复杂度就是O(sqrt(n));

那么我们再查询的时候,对于每个整块,我们可以知道它是完全有序的,所以我们可以直接二分查找返回。对于零散块,我们仍然选择暴力枚举,那么查询操作的复杂度就是O(sqrt(nlogn))。

所以整个操作我们就可以在O(qsqrt(nlogn))的复杂度内完成了。

笔者秉承懂了算法不看模板的法则,自己手动实现了一下这个题目。接下来分块讲述一下代码的意义:

这一部分就是预处理并且分块的部分,和块的左右区间的处理。

然后在你的分块主体开始之前,必须要有的一条语句:

这条语句就是先把b数组的每一个块中的数据排好序,这样要不然很有可能找的时候由于每一块的b数组还没有排序导致查找错误。

然后就是分块的主体部分,我们分成修改和查询分别看一下:

这个就是修改操作。要注意的是,在读入的x和y点属于同一个块的时候我们要特殊操作。

如果不在同一个块里,我们就遍历包含的所有整块,打上标记。然后对于左右那两个零散块,我们直接枚举就可以了。为什么用的是a数组而不是b数组?因为b数组在排完序之后下标代表的意义是数的大小顺序,而不是我们一开始读入的顺序,不能直接修改b数组。还有一个就是,这里笔者为了打上去方便,修改b数组的时候用了sort,这样我们的复杂度就增加了一个sqrt(logn)但是我们使用归并重构零散块的话还是可以达到sqrt(n)的。对于 在同一个块里的,我们也是直接暴力枚举就可以了。

为什么这些零散块可以暴力枚举,复杂度不会很高么?不会的,在修改每一个零散块的时候,我们最多也就修改sqrt(n)个点,所以并不会有特别高的额复杂度。

这个是查询操作,怎么查找刚才都已经说过了,同样零散块我们就暴力枚举即可。

那么这道题就这么完成了。

 纯粹让你用分块完成的题目比较少,但是我们可以用这东西水一水分,毕竟这玩意比线段树什么的好写多了。

 

转载于:https://www.cnblogs.com/victorique/p/8488216.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/252288.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

开始使用gitlab

不得不说,我真不是一个合格的程序猿,工作马上两年了,github和gitlab用的一点也不熟练,每次兴致来了就搞几下,可是每次都浅尝辄止,不求甚解,时间一长,上一次练习的步骤就都记不起来了…

淘宝top平台调用接口响应时间优化

我的专栏地址:我的segmentfault,欢迎浏览 一、背景 调用top接口的响应时间长(160ms左右),超时和连接异常频繁发生。导致消息组件消费工程的tps遇到瓶颈(单实例单消息队列250tps),只能通过增加实…

win10上编译libharu库

背景: 最近的项目需要自动的生成pdf文件,我在网上查看相关的资料,发现目前比较流行的生成pdf文件的库有两个,一个是libpdf,另一个是libharu。libpdf个人使用时免费的但是商业使用就需要收费了,否则得到的p…

爬虫——正则表达式re模块

为什么要学习正则表达式 实际上爬虫一共就四个主要步骤: 明确目标:需清楚目标网站爬:将所有的目标网站的内容全部爬下来取:在爬下来的网站内容中去掉对我们没有用处的数据,只留取我们需要的数据处理数据:按…

深入Spring Boot:快速集成Dubbo + Hystrix

2019独角兽企业重金招聘Python工程师标准>>> 背景 Hystrix 旨在通过控制那些访问远程系统、服务和第三方库的节点,从而对延迟和故障提供更强大的容错能力。Hystrix具备拥有回退机制和断路器功能的线程和信号隔离,请求缓存和请求打包&#xff…

opencv图像仿射变换和普通旋转

背景:今天需要对程序生成的图像进行旋转90度和下采样操作,当然还有改变图像类型的操作,就是把原来.png的图像转换为.jpg的图像,主要是我目前使用libharu库,无法成功从本地加载png图像到pdf中去,不得不使用j…

try{}里有一个 return 语句,那么紧跟在这个 try 后的 finally {}里的 code 会 不会被执行,什么时候被执行,在 return 前还是后?...

这是一道面试题,首先finally{}里面的code肯定是会执行的,至于在return前还是后, 看答案说的是在return后执行,我觉得不对,百度了一下,有说return前的,有说return后的,还有return中间…

相机和镜头选型需要注意哪些问题

背景: 最近需要优于项目需求需要对工业相机和镜头进行选型,于是我就开启的学习相机之旅,虽然我一直在做机器视觉方向,但是我对相机的了解还是很少,我想正好趁这次机会好好学习一下。如果有错误的观点请指正。 一、相…

正則表達式,终极使用!3个工具,搞定一切

文章前提,本人。不会正则的不论什么语法,仅仅懂一点正则的概念。本人从未自己写过正则,都是网上收罗进行改动的。相同。没有时间去研究正则。 可是为了方便,入手了几个工具。 如今就为大家一一展示。 第一个,regexBuil…

VS2017 C++工程 执行python脚本

我解决了哪怕很小的一个问题,我也想记录下来来见证我的经历。 背景: 一、使用libhuru库生成pdf报告 最近参与一些测试工作,希望测试结束后能够根据测试得到的数据和图像自动生成测试报告,最开始调研到了生成报告的库有libharu和…

运行imgui例程

背景:目前在做一个视觉测试系统,需要做一个界面,将相机获取的图像,以及测试过程中的数据呈现在界面上,在我印象里,做界面就用qt吧,直到这个月真要开始做界面了,我的领导给我建议用im…

性能测试总结(三)--工具选型篇

性能测试总结(三)--工具选型篇 本篇文章主要简单总结下性能测试工具的原理以及如何选型。性能测试和功能测试不同,性能测试的执行是基本功能的重复和并发,需要模拟多用户,在性能测试执行时需要监控指标参数,同时性能测试的结果不是…

创建一个最简单的imgui测试用例

在上一篇文章中,我们初步认识了一下imgui,并且成功运行了他提供的demo。这只是开始学习imgui的第一步,在实际使用时,我们需要将imgui应用到自己的工程中去,所以你需要具备将imgui加到你工程中去的能力,简单起见&#x…

idea中maven的setting.xml的配置

2019独角兽企业重金招聘Python工程师标准>>> <?xml version"1.0" encoding"UTF-8"?> <settings xmlns"http://maven.apache.org/SETTINGS/1.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance&qu…

[精华][推荐]SSO CAS单点登录框架学习 搭建详细步骤及源码

1.了解单点登录 SSO 主要特点是: SSO 应用之间使用 Web 协议(如 HTTPS) &#xff0c;并且只有一个登录入口. SSO 的体系中有下面三种角色: 1) User(多个) 2) Web 应用(多个) 3) SSO 认证中心(一个) 2.SSO 实现包含以下三个原则 1) 所有的登录都在 SSO 认证中心进行。 2) SS…

电脑下载的M4A格式文件怎么转换为MP3格式

M4A文件格式并不是一个家喻户晓的名字&#xff0c;与&#xff2d;&#xff30;&#xff13;格式相比&#xff0c;知名度远远落后。但是&#xff0c;这并不意味着它无关紧要&#xff0c;有时候我们下载的音乐可能就是M4A格式的&#xff0c;如果换一个设备播放可能就会出现格式不…

python-for循环

一、功能 for 循环提供了python中最强大的循环结构&#xff08;for循环是一种迭代循环机制&#xff0c;而while循环是条件循环&#xff0c;迭代即重复相同的逻辑操作&#xff0c;每次操作都是基于上一次的结果&#xff0c;而进行的&#xff09; Python for循环可以遍历任何序列…

KindEditor

1、进入官网 2、下载 官网下载&#xff1a;http://kindeditor.net/down.php 3、文件夹说明 ├── asp asp示例 ├── asp.net asp.net示例 ├── attached 空文件夹&#xff0c;放置关联文件attached ├── …

使用realsense t265测试svo2.0视觉里程计

毕业三年了&#xff0c;现在是第二份工作&#xff0c;第一份工作已经结束一年半了&#xff0c;这意味着&#xff0c;我有一年半的时间没有搞视觉SLAM相关的东西了&#xff0c;虽然在第二份工作也是做视觉相关的&#xff0c;但是只是用到一些目标识别和跟踪的知识&#xff0c;并…

面试必问之JVM原理

1&#xff1a;什么是JVM JVM是Java Virtual Machine&#xff08;Java虚拟机&#xff09;的缩写&#xff0c;JVM是一种用于计算设备的规范&#xff0c;它是一个虚构出来的计算机&#xff0c;是通过在实际的计算机上仿真模拟各种计算机功能来实现的。Java虚拟机包括一套字节码指令…