【学习笔记】线段树二分
这是真正的线段树二分
首先拆分询问区间。可以证明每一层遍历到的区间不会超过
4
4
4 个。所以复杂度是
log
n
\log n
logn 。
类似的,可以通过 递归左子树->等待答案->递归右子树 的方法来查询 [l,r] 中最右或最左的满足条件的点。复杂度同样是
log
n
\log n
logn 。
例题1:CF689D Friends and Subsequences
求满足下列条件的区间
[
l
,
r
]
[l,r]
[l,r] 的数量,
n
≤
2
e
5
n\leq 2e5
n≤2e5 。
solution:
固定 l 端点,二分 r 端点,设函数 qry1(p,L,R) 表示 [L,R] 中满足 max(a_l,a_{l+1},…,a_k)>min(b_l,b_{l+1},…,b_k) 的最小的点,其中 L<=k<=R 。
同理设 qry2(p,L,R) 表示 [L,R] 中满足 max(a_l,a_{l+1},…,a_k)<min(b_l,b_{l+1},…,b_k) 的最大的点,其中 L<=k<=R 。
那么用全局变量 MIN,MAX 记录遍历到的所有点中的最大值,最小值,每次递归左子树,等待答案,再递归右子树,时间复杂度 O(nlogn) 。
关于 qry2:
上述两图证明了任意时刻都只会遍历左右子树中的一个(分叉点除外),复杂度得到证明。
总结:本题线段树二分做法依赖于单调性,做题时要善于观察。
__EOF__

本文链接:https://www.cnblogs.com/cqbzly/p/17530257.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步