今天看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}