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。
代码太丑不放了,自己看吧。
本文来自博客园,作者:myee,转载请注明原文链接:https://www.cnblogs.com/myee/p/gym102452H.html