久未放晴的天|

TulipeNoire

园龄:1年10个月粉丝:18关注:17

学习笔记(?):一类查询 kth 的整体二分 trick

问题大概就是有若干次修改(也有可能没有)和若干次查询,查询形如查某个范围的 kth。

做法是,把可能成为答案的候选集合按照权值大小排序。询问集合可以不用管顺序。然后开始二分。

我们令 solve(l,r,L,R) 表示第 lr 个询问的 kth 一定在候选序列的第 LR 个数。此时我们令把 [L,R] 均匀分成两部分,然后把左边一部分塞入某个数据结构,然后再对于 lr 每个查询,求出有数据结构内有多少个元素能对它产生贡献。如果少于 k 个,则其答案明显在右半,此时把 k 减去贡献数,并将其标记为 B 类。否则答案在左半,直接标记为 A 类。最后再把 A 类统一移到所有 B 类的左边,然后两边递归计算。可以知道这样数据结构插入和查询次数都是 O((n+q)logn) 的。

假如说有修改操作,那么就类似于归并一样再按时间维排一次序就可以了,并且这不会成为复杂度瓶颈。

然后你发现这是个万金油 trick 啊,很多题都可以直接无脑套。

本文作者:TulipeNoire

本文链接:https://www.cnblogs.com/TulipeNoire/p/18390715/Parallel-Binsearch

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   TulipeNoire  阅读(19)  评论(1编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起