题面:
题意:
有一个四次函数的集合 f i ( x ) = ( x − a i ) 4 + b i f_i(x)=(x-a_i)^4+b_i fi(x)=(x−ai)4+bi。
有以下三种操作
(1) 1 1 1 a a a b b b ,往集合中添加新的四次函数 f n + 1 = ( x − a ) 4 + b f_{n+1}=(x-a)^4+b fn+1=(x−a)4+b,然后 n = n + 1 n=n+1 n=n+1
(2) 2 2 2 t t t ,从集合中删除 f t ( x ) f_t(x) ft(x)
(3) 3 3 3 x x x ,在当前集合中询问 f i ( x ) f_i(x) fi(x) 的最小值。
官方题解:
题解:
(1) 先考虑证明一下时间复杂度,相当于我们有 n l o g n nlogn nlogn 个点放在线段树上,每个点只能放在线段树的一个节点上,线段树的一个节点可以放多个点。然后我们对线段树的每个节点进行处理,每个节点处理的时间复杂度是 O ( c n t ∗ l o g ( c n t ) ) O(cnt*log (cnt)) O(cnt∗log(cnt)) 的, c n t cnt cnt 为线段树上当前节点上面的点数, ∑ c n t = n l o g n \sum cnt=nlogn ∑cnt=nlogn,那么总的时间复杂度就是 O ( n l o g 2 n ) O(nlog^2n) O(nlog2n) 的。
(2)我们离线所有操作序列,按照时间建立线段树,每个函数在时间轴上的存在部分一定是一个区间,在线段树上至多对应 l o g n logn logn 个区间,将函数在时间轴上的存在部分插入线段树。
对于每个询问,其在时间轴上对应一个点,在线段树上对应一个叶子节点,那么对其有贡献的四次函数 f f f,一定在线段树对应叶子节点到根这 l o g n logn logn 个节点上。我们将一个询问拆为 l o g n logn logn 个询问插入这些节点(最后再取个最小值即可)。
现在对于线段树的每个节点,有若干标记和若干询问。这是一个静态问题。下面考虑怎么在 n l o g n nlogn nlogn 的时间复杂度内处理线段树的一个节点。
对于每个询问 x x x ,分别找到 a i ≤ x a_i\le x ai≤x 和 x ≤ a i x\le a_i x≤ai 的最优函数即可。
以 a i ≤ x a_i\le x ai≤x 为例,考虑两个函数 ( x − a i ) 4 + b i (x-a_i)^4+b_i (x−ai)4+bi 以及 ( x − a j ) 4 + b j (x-a_j)^4+b_j (x−aj)4+bj ,其中 a