莫队算法学习笔记(一)——普通莫队

本文介绍了莫队算法的基本思想和应用,通过分块与暴力结合实现O(N^2)时间复杂度的区间询问离线算法。详细讲解了如何排序询问、如何转移答案,并分析了算法的时间复杂度。还给出了两道典型例题【洛谷2709】小B的询问和【洛谷1494】[国家集训队] 小Z的袜子的解题链接。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

在学习莫队算法之前,我一直以为这是一个很高深的算法。(实际上,它就是一个很高深的算法)
这个算法玄学地分块暴力两大算法实现了二合一,从而打造出了一个时间复杂度为 O ( N N ) O(N\sqrt N) O(NN )求解多个区间询问离线算法


具体介绍

首先,我们以询问中 l l l所在的区间为第一关键字,以 r r r的位置为第二关键字进行排序。

然后,我们可以先暴力求解第一个询问,并将 L L L指针指向第一个询问的 l l l,将 R R R指针指向第一个询问的 r r r

随后,对于第 i i i个问题,我们都可以将当前询问的区间 [ l i , r i ] [l_i,r_i] [li,ri]的答案从上一次询问的区间 [ l i − 1 , r i − 1 ] [l_{i-1},r_{i-1}] [li1,ri1]的答案推得。只要将 L L L指针从 l i − 1 l_{i-1} li1这个位置开始向 l i l_i

### 关于NULL的理解 在C语言中,`NULL` 是个特殊的宏定义,其本质是个值为 `0` 的指针。这里的 `0` 并不是普通的整数零,而是个特定的内存地址——即 **空地址** 或者称为 **零地址**[^1]。 具体来说,在不同的编程环境中,`NULL` 可能有不同的实现方式。例如: - 在 C++ 中,通常会简单地将 `NULL` 定义为 `0`。 - 而在纯 C 环境下,则可能将其定义为 `(void*)0`,这表明它是个指向 `void*` 类型的特殊指针[^2]。 #### NULL的实际意义 当程序员使用 `NULL` 来初始化或者赋值给某个指针时,实际上是在告诉该指针不指向任何有效的内存位置。这种做法有助于防止程序尝试访问非法或未分配的内存区域从而引发崩溃或其他不可预测的行为。 然而需要注意的是,如果试图解引用个被设置成 `NULL` 的指针(比如通过此指针对其所假设存在的对象执行操作),大多数现代操作系统都会触发保护机制并抛出异常—这就是所谓的“段错误(segmentation fault)”现象。 下面展示如何安全地处理涉及 `NULL` 的情况的个例子: ```c #include <stdio.h> #include <stdlib.h> int main() { int *p = NULL; // 正确地声明了个初始为空(null)状态下的整型指针 if (p != NULL){ printf("%d\n", *p); } else{ puts("Pointer is null, cannot dereference."); } return EXIT_SUCCESS; } ``` 上述代码片段展示了良好的实践方法:总是先检查指针是否非空再对其进行进步的操作。 ### Fast R-CNN学习资源推荐 对于希望深入研究Fast R-CNN算法及其应用的人来说,可以从以下几个方面入手获取相关资料和笔记: 1. 原论文阅读:“Rich feature hierarchies for accurate object detection and semantic segmentation.” 这篇由Ross Girshick等人发表的文章详细介绍了R-CNN系列模型的基础理论框架以及改进版本Fast/Faster R-CNN的设计思路。 2. GitHub项目探索:许多开发者基于原始研究成果开发出了开源实现库,这些仓库不仅包含了完整的源码还附带详细的文档说明。例如官方caffe实现或者其他社区贡献如PyTorch迁移版等都是非常宝贵的第手参考资料。 3. 博客文章总结:网络上也有不少个人撰写的教程类博文专门讲解Fast R-CNN的工作原理、训练流程还有调参技巧等内容,适合初学者快速入门的同时也能帮助有定基础的人巩固知识点。 4. MOOC课程观看:些知名大学开设的数据科学/机器视觉方向在线教育平台提供了系统的授课视频材料覆盖到目标检测领域内的经典技术包括但不限于Fast R-CNN家族成员们。 5. 技术论坛交流讨论:像Stack Overflow,Cross Validated这样的问答网站聚集了大量的专业人士可以就遇到的具体问题寻求解答;另外Reddit子板块r/MachineLearning也是分享心得体验的好地方。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值