今天看CF,读大牛代码发现了了一个有趣的算法,研究了半天大概明白是了是什么意思。
算法主要解决这样一个问题
有N对数,(a0,b0),(a1,b1)......用O(NlgN)复杂度排序预处理后可以在O(lgm)复杂度内知
所有比第i个数的a值小的数的b值的极值。(M是ai,bi的最大值)
试想,两个数x,y,x能在lg(x)的复杂度内到达到达状态Sx集合,和状态集合Tx;y则对应Sy和Ty
其中S和T都用二进制表示。而且满足如果x < y则有Sy ∩ Tx != ∅。这样就能解决上面的问题。
具体的方法有不唯一。列出两种
第一种
Sx = {x = x | (x+1)}
Tx = {x = x&(x+1)-1}
第二种
Sx = {x = x & (x-1)}
Tx = {x = (x | (x-1)) + 1}
本文介绍了一种在O(NlgN)预处理后可在O(lgm)时间内查询所有比目标数a值小的数的b值极值的算法。通过定义特定状态集合Sx和Tx,并利用二进制表示来实现快速查找。

被折叠的 条评论
为什么被折叠?



