根号数据结构

根号数据结构

在以前,我十分讨厌带根号的数据结构,认为不够优雅.  

但是在很多时候,带 log 数据结构的作用比较局限,且复杂.  

这个时候,根号数据结构的作用是十分巨大的.   

根号数据结构主要依赖于复杂度的分析,即将看似暴力的做法捏合在一起.   

普通莫队

最简单的莫队.  

可以处理只有查询,没有修改的问题.  

每次先按照左端点所在块排序,若块相同则按照右端点排序.  

时间复杂度为 O(qn).  

1
2
3
4
bool cmp(query i, query j) {
    if(i.l / B == j.l / B) return i.r < j.r;
    return i.l / B < j.l / B;
}

没有什么其他强调的,但尽量不要在后面多加一个 log, 否则复杂度就很难看.  

带修改莫队

加入现在的题目要支持单点修改,区间查询,普通莫队就无能为力了.  

这时就诞生了带修改莫队.  

按照 l,r 所在块为第 1,2 关键字排序,然后询问时间为第 3 关键字.  

每次先将左右指针按照普通莫队一样移动到询问区间,然后再移动修改操作的时间轴.  

加入当前加入的修改操作对区间无影响,则直接忽略.  

但是我们可能对后面的区间有影响(这个数只是当前不在询问区间里,但以后可能在)

所以无论有无影响都要执行修改操作(就是交换点值之类的)  

排序代码: 

1
2
3
4
5
6
7
8
bool cmp(query i, query j) {
    if(i.l / B == j.l / B) {
        if(i.r / B == j.r / B)
            return i.id < j.id;
        else return i.r / B < j.r / B; 
    }
    else return i.l / B < j.l / B;
}

时间复杂度为 O(m×n23).

例题:CF940F 

要注意使用带修改莫队的前提是单点更新的操作可以十分方便地进行撤回.

 

posted @   guangheli  阅读(188)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
点击右上角即可分享
微信分享提示