1 条题解

  • 0
    @ 2025-1-24 21:02:06

    莫队

    #include <bits/stdc++.h>
    using namespace std;
    const int maxn = 1e5 + 5;
    
    int n, m, k, blo, a[maxn], Xor[maxn], t[maxn*20];
    long long ans[maxn], tmp;
    
    struct Query {
        int id, l, r;
    
        bool operator < (const Query &b) const {
            if (l / blo != b.l / blo)
                return l < b.l;
            return (l / blo % 2) ? (r < b.r) : (r > b.r);
        }
    } query[maxn];
    
    void add(int x) {
        tmp += t[x^k];
        t[x]++;
    }
    
    void del(int x) {
        t[x]--;
        tmp -= t[x^k];
    }
    
    int main() {
        scanf("%d%d%d", &n, &m, &k);
        blo = sqrt(n);
        for (int i = 1; i <= n; i++) {
            scanf("%d", a+i);
            Xor[i] = Xor[i-1] ^ a[i];
        }
        for (int i = 1; i <= m; i++) {
            query[i].id = i;
            scanf("%d%d", &query[i].l, &query[i].r);
            query[i].l--;
        }
        sort(query+1, query+m+1);
        for (int i = 1, l = 0, r = -1; i <= m; i++) {
            while (query[i].l < l) add(Xor[--l]);
            while (query[i].l > l) del(Xor[l++]);
            while (query[i].r < r) del(Xor[r--]);
            while (query[i].r > r) add(Xor[++r]);
            ans[query[i].id] = tmp;
        }
        for (int i = 1; i <= m; i++)
            printf("%lld\n", ans[i]);
        return 0;
    }
    
    
    
    • 1

    信息

    ID
    8
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    (无)
    递交数
    2
    已通过
    1
    上传者