莫队算法模板

//#include<bits/stdc++.h>
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<vector>
#include<cstring>
#include<map>
#include<set>
#include<cmath>
#include<queue>
#include<bitset>
#include<utility>
#include<functional>
#include<iomanip>
#include<sstream>
#include<ctime>
#include<cassert>
#define A first
#define B second
#define mp make_pair
#define pb push_back
#define pw(x) (1ll << (x))
#define sz(x) ((int)(x).size())
#define all(x) (x).begin(),(x).end()
#define rep(i,l,r) for(int i=(l);i<(r);i++)
#define per(i,r,l) for(int i=(r);i>=(l);i--)
#define FOR(i,l,r) for(int i=(l);i<=(r);i++)
#define eps 1e-9
#define PIE acos(-1)
#define cl(a,b) memset(a,b,sizeof(a))
#define fastio ios::sync_with_stdio(false);cin.tie(0);
#define lson l , mid , ls
#define rson mid + 1 , r , rs
#define ls (rt<<1)
#define rs (ls|1)
#define INF 0x3f3f3f3f
#define lowbit(x) (x&(-x))
#define sqr(a) a*a
#define ll long long
#define vi vector<int>
#define pii pair<int, int>
#define dd(x) cout << #x << " = " << (x) << ", "
#define de(x) cout << #x << " = " << (x) << "
"
#define endl "
"
using namespace std;
//**********************************
const int maxn=1<<20;
int n,m,k;
int belong[maxn];
ll flag[maxn],ans[maxn],Ans;
int a[maxn];
int L=1,R=0;//下标从1开始 
struct Node{
    int l,r,id;
}q[maxn];
bool cmp(Node a,Node b)
{
    if(belong[a.l]!=belong[b.l])return belong[a.l]<belong[b.l];
    return a.r<b.r;
}
void insert(int x)
{
    Ans+=flag[a[x]^k];//<-----注意顺序
    flag[a[x]]++;      
}
void erase(int x)
{
    flag[a[x]]--;   //<-----注意顺序                                                        
    Ans-=flag[a[x]^k]; 
}
//**********************************
//**********************************
int main()
{
    scanf("%d%d%d",&n,&m,&k);
    int s=sqrt(n);
    FOR(i,1,n)scanf("%d",&a[i]),a[i]=a[i]^a[i-1],belong[i]=i/s;
    FOR(i,1,m)scanf("%d%d",&q[i].l,&q[i].r),q[i].id=i;
    sort(q+1,q+1+m,cmp);
    flag[0]=1;
    FOR(i,1,m){
        while(L<q[i].l)erase(L++-1);
        while(L>q[i].l)insert(--L-1);
        while(R<q[i].r)insert(++R);
        while(R>q[i].r)erase(R--);
        ans[q[i].id]=Ans;
        //erase都是后缀减
        //insert都是前缀加 
    }

    FOR(i,1,m)cout<<ans[i]<<endl;
    return 0;
}
原文地址:https://www.cnblogs.com/klaycf/p/9559468.html