一种神秘的均摊方法

UOJ 191 Unknown

你需要维护一个向量序列,支持如下操作:

  • 在末尾加入一个向量 \((u,v)\)
  • 删除末尾的向量。
  • 询问 \([l,r]\) 内的向量与 \((x,y)\) 叉积的最大值。

\(n,m\le5e5\)

这个东西我们首先一眼用李超树或者维护凸包来做全局询问最大值的子问题。

考虑怎么把 \([l,r]\) 内的向量搞出来,显然套一个线段树就可以了。

至此,我们只需要在线段树某一个节点满了之后再构建内层数据结构就可以支持除撤销以外的操作。

为什么不能支持撤销呢?因为我们插入复杂度的正确性实质上是由均摊保证的,当我们在一次开销很大的修改处反复操作就会寄。

通常而言我们会考虑使用非均摊的方式。但是这个题十分的神奇啊。我们可以考虑如下一种神奇的均摊:

对于线段树上的一个节点,我们恰在与它同层的下一个节点被填满时构建它。询问到一个没构建的点的时候就继续向下递归。

我们先考虑一次询问的复杂度。显然我们每层最多有两个点没有构建,而一共只有 \(O(\log n)\) 层,所以我们额外带来的复杂度不超过 \(O(\log n)\)

再考虑构建操作的复杂度。一个构建好的点要被删除需要至少其长度次删除操作,所以均摊下来是对的。(考虑对每一层的节点分开想更清楚)

这个东西有什么用呢?不知道。等遇到了再来 upd。

posted @ 2023-05-29 19:26  PYD1  阅读(58)  评论(0)    收藏  举报