gym102452H

题意简述

题目链接

给你一个初始各项为空的长度为 \(n\) 的序列。

操作有:

  • 在序列第 \(k\) 位插入一个数 \(v\)
  • 查询 \([l,r]\) 中到 \(v\) 最近的数有多近,无数输出 \(-1\)

多测,\(\sum n\le5\times10^5\)\(\sum m\le10^6\)

时限 \(4.5s\)


思路

这是一个在线做法

我们一眼线段树套 set,似乎秒了?

不幸,我们被卡常了(已经加了火车头、快读)。

set 太慢了,我们手写平衡树?

使用 Splay 后,T 的更加厉害了

考虑换成 yk-BST,虽然复杂度更劣了,但实际更快了。

然而,精细化实现后,我们稳定被卡在了 \(12\) 号点。

什么,你说离线?

不必,我们还有 zkw 线段树呀!

为了方便,散装了一个类似于 zkw 线段树的伪迭代版线段树,效率足够了,我们获得了卡线AC

不过还是有一点要注意,就是不要直接开 \(4\times10^7\)vector 而应该开指向 BST 的指针,不然光开 vector 的时间就会 T。

代码太丑不放了,自己看吧。

posted @ 2022-02-14 15:13  myee  阅读(26)  评论(0编辑  收藏  举报