首页 > 其他分享 >关于一种维护凸包的根号数据结构

关于一种维护凸包的根号数据结构

时间:2024-02-16 22:34:20浏览次数:28  
标签:整块 线段 sqrt 凸包 数据结构 散块 根号

本文介绍了笔者由一道题的根号做法受到启发,独自摸索出来的一个数据结构。
由于笔者能力和精力有限,无法查找已有的资料,如果有哪位巨已经提出来了记得踩我一脚。

介绍

这个数据结构维护凸包,支持以下操作:

  • \(O(\sqrt{n})\) 在线加入/删除任意一条线段
  • \(O(\sqrt{n}\log\sqrt{n})\) 在线询问/\(O(\sqrt{n})\) 离线询问当 \(x=i\) 时 \(y\) 值最大/最小的线段
  • \(O(\sqrt{n})\) 在线合并两个凸包

实现方式

设总线段数为 \(n\),每个凸包内将所有线段分块,按照 \(\sqrt{n}\) 条线段为一块,块内线段由斜率从小到大排序。整个凸包由若干大小为 \(\sqrt{n}\) 的块(后称“整块”)和最多一个大小不足 \(\sqrt{n}\) 的块(后称“散块”)组成。
每个整块中预处理出一个凸包,该凸包的拐点数不超过 \(\sqrt{n}\)。组成凸包的所有线段将值域切割为不超过 \(\sqrt{n}\) 段。
加线段时,直接往散块中暴力插入保持斜率从小到大排序,若散块的大小大于 \(\sqrt{n}\) 则把它变成整块,新建一个空的散块。
删线段时,如果该线段处于散块中则可以暴力删除;如果该线段处于整块中则破坏整块,将整块中的线段与散块中的线段进行二路归并,保持斜率从大到小排序。若散块的大小大于 \(\sqrt{n}\),从中提取出任意 \(\sqrt{n}\) 个元素作为一个单独的整块。
查询时遍历所有整块,二分查找,对散块的所有元素暴力即可。离线打懒标记可以做到不带 \(\log\)。
在线合并考虑合并整块,合并散块,若散块的大小大于 \(\sqrt{n}\),从中提取出任意 \(\sqrt{n}\) 个元素作为一个单独的整块。

标签:整块,线段,sqrt,凸包,数据结构,散块,根号
From: https://www.cnblogs.com/lunatic-unleashed/p/18017578

相关文章

  • 数据结构——链表
    链表(LinkedList)一种线性数据结构,其中的每个元素都是一个节点对象。各个节点通过“引用”(指针)相连接,引用中记录了下一个节点的内存地址,通过其可以定位并访问到下一个节点。链表对比数组有更好的灵活性,数组要求内存空间是连续的,但当数组非常庞大时,可能无法提供那么大的连续空间,同......
  • 复杂数据结构
    复杂数据结构一些巨大的数据结构题目CF1336FJourney题意:给定一棵树和\(m\)条链,求多少对链的交中包含的边\(\geqslantk\)。思路:首先对链交的情况进行分类。第一种是\(lca(x_1,y_1)\nelca(x_2,y_2)\),我们在深度较大的\(lca\)处统计答案,那么我们把一条链的贡献记在端点......
  • 小清新数据结构
    小清新数据结构很小清新的数据结构题,主要是线段树和树状数组。CF840DDestiny题意:求区间内是否存在出现次数严格大于\(\dfrac{r-l+1}{k}\)的数。来自Alex_Wei老师的神仙思路:设\(d\)为严格大于\(\dfrac{r-l+1}{k}\)的最小数,那么如果一个数\(x\)至少出现了\(d\)次,就得满足一定......
  • 基础数据结构笔记
    链表与邻接表:树与图的存储 单链表  画个图就很好理解了   例题826.单链表acwing——826.单链表_awcing826-CSDN博客实现一个单链表,链表初始为空,支持三种操作:(1)向链表头插入一个数;(2)删除第k个插入的数后面的数;(3)在第k个插入的数后插入一个数现在要......
  • 凸包学习笔记
    凸包一般通过证明或观察出斜率有单调性于是可以用凸包维护。P5155[USACO18DEC]BalanceBeamP题意:有长为\(n\)的序列,每次等概率向左右移动一格,也可以结束并获得当前位置上的值,求每个位置的最大期望收益。思路:完全不懂期望!首先有一个结论,在\([0,L]\)上的\(x\)处,每次等概率向......
  • 根号分治学习笔记
    根号分治根号分治其实一般是广义上的阈值分治,当范围不超过\(B\)时用一种方法,超过\(B\)时用另一种做法。之所以叫根号分治主要是大部分的应用都是在和一定时,不超过\(\sqrt{n}\)的可以把所有\(1\sim\sqrt{n}\)的都处理,超过\(\sqrt{n}\)的最多只有\(O(\sqrt{n})\)个,也......
  • [数据结构] 串与KMP算法详解
    写在前面今天是农历大年初三,祝大家新年快乐!尽管新旧交替只是一个瞬间,在大家互祝新年快乐的瞬间,在时钟倒计时数到零的瞬间,在烟花在黑色幕布绽放的瞬间,在心底默默许下愿望的瞬间……跨入新的一年,并不意味了一切都会朝着更美好,也没有什么会从天而降,我们赋予了它这份意义,让它自然裹......
  • 【数据结构】C语言实现栈的相关操作
    栈栈是一种遵循先入后出逻辑的线性数据结构,是只能在表的一端进行插入和删除运算的线性表进行插入和删除的一端的称为栈顶,另一端称为栈底栈的操作规则是后进先出或者是先进后出栈可以用数组或者链表实现,用数组实现的叫做顺序栈,用链表实现的叫做链栈顺序栈表示(数组)在数组上......
  • 数据结构套路大赏
    现在感觉没啥写的,先留着以后会填的(一、线段树:1、线段树维护哈希2、线段树套DSU(其实没啥用)二、平衡树: 三、树状数组:1、树状数组二分(倍增),常数小,而且好写四、分块: 五、杂项:1、留意“取模”类的修改操作,每次取模会至少减半,哪怕看似暴力的解法也很有可能不高于nlogn2、扫......
  • 【Java 并发】【十】【JUC数据结构】【十】PriorityBlockingQueue 原理
    1 前言这节我们继续看看另一个队列 PriorityBlockingQueue,优先级的哈。2 PriorityBlockingQueue介绍PriorityBlockingQueue是带优先级的无界阻塞队列,每次出队都返回优先级最高或者最低的元素。其内部是使用平衡二叉树堆实现的,所以直接遍历队列元素不保证有序。默认使......