莫队算法浅析

莫队:著名 \(O(n\sqrt{n})\) 离线算法,思想基于分块。

做法

\(t = \sqrt{n}\) ,将区间左端点分成 \(t\) 块,按块从小到大排序,再将块内按从小到大排序。即:

bool compare(node s1 , node s2){
	if(s1.x / t < s2.x / t) return true;
	if(s1.x / t > s2.x / t) return false;
	return s1.y < s2.y;
}

之后双指针维护序列即可。

奇偶排序 (优化)

当块编号为奇数时按右端点升序排序 , 偶数时按右端点降序排序。

bool compare(node s1 , node s2) {
    if(s1.x / t == s2.x / t) {
        if((s1.x / t) & 1) return s1.y < s2.y;
            else return s1.y > s2.y;
    }
    return s1.x / t < s2.x / t;
}
posted @ 2021-10-15 01:08  BrotherCall  阅读(44)  评论(0编辑  收藏  举报