2020 Multi-University Training Contest 2---- HDU--6770、Dynamic Convex Hull (离线、分治)

该博客介绍了如何解决一个离线处理动态凸包的问题,涉及四次函数集合的操作,包括添加、删除和查询最小值。通过线段树和分治策略,实现了在O(nlog^2n)的时间复杂度内解决问题。文章详细阐述了算法的思路,包括证明时间复杂度和具体实现方法。
摘要由CSDN通过智能技术生成

题目连接

题面:
在这里插入图片描述
题意:
有一个四次函数的集合 f i ( x ) = ( x − a i ) 4 + b i f_i(x)=(x-a_i)^4+b_i fi(x)=(xai)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=(xa)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(cntlog(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 aix x ≤ a i x\le a_i xai 的最优函数即可。

a i ≤ x a_i\le x aix 为例,考虑两个函数 ( x − a i ) 4 + b i (x-a_i)^4+b_i (xai)4+bi 以及 ( x − a j ) 4 + b j (x-a_j)^4+b_j (xaj)4+bj ,其中 a

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值