zoukankan      html  css  js  c++  java
  • 莫队算法

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

    主要思想是分块 时间复杂度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;
    }
  • 相关阅读:
    P1182 数列分段Section II
    P1119 灾后重建
    P1133 教主的花园
    P1077 摆花
    P2002 消息扩散
    P2341 [HAOI2006]受欢迎的牛(tarjan+缩点)
    luoguP1726 上白泽慧音
    P1053 篝火晚会
    P2296 寻找道路
    P1156 垃圾陷阱
  • 原文地址:https://www.cnblogs.com/hznumqf/p/12570603.html
Copyright © 2011-2022 走看看