Loading

莫队算法

用于解决大部分区间离线问题的离线算法

主要思想是分块 时间复杂度O(n sqrt(n))

对于当前区间 [L,R] 1.加上当前区间左边一格的贡献,Add(--L) 2.加上当前区间右边一格的贡献 Add(++R) 3.减去当前区间最左一格的贡献 Sub(L++) 4.减去当前区间最右一格的贡献 Sub(R--)

分块 分成sqrt(n) 块

// Add Sub 函数根据具体题目写

int a[maxn];
int pos[maxn];
int ans[maxn];

struct Q {
    int l, r, k;
    friend bool operator < (const Q& a, const Q& b) {
        return pos[a.l] == pos[b.l] ? a.r < b.r : pos[a.l] < pos[b, l];
    }
}q[maxn];

int res;

int main() {
    int n, m;
    scanf("%d%d", &n, &m);
    int siz = sqrt(n);

    for (int i = 1; i <= n; i++) {
        scanf("%d", &a[i]);
        pos[i] = i / siz;
    }
    for (int i = 0; i < m; i++) {
        scanf("%d %d", &q[i].l, &q[i].r);
        q[i].k = i;
    }
    sort(q, q + m);
    
    int l = 1, r = 0;
    for (int i = 0; i < m; i++) {
        while (q[i].l < l) Add(--l);
        while (q[i].r > r) Add(++r);
        while (q[i].l > l) Sub(l++);
        while (q[i].r < r) Sub(r--);
        ans[q[i].k] = res;
    }
    for (int i = 0; i < m; i++) {
        printf("%d\n", ans[i]);
    }
    return 0;
}

 

posted @ 2020-03-25 21:24  MQFLLY  阅读(137)  评论(0编辑  收藏  举报