其实我觉得莫队的思想和分块有一点想(在处理方法上),莫队的核心就在于用已知去在最少的开销下获取未知。
先将整个序列分成块,然后进行排序,对于设定的L,R指针要想让他们每次走的步数最少,那么可以按左端点所在的区间按降序排列,然后相等时如果是奇数,就按右端点升序,否则就降序
就相当于奇数时,右端点不断向右伸展,到偶时,右端点不断向左伸展,避免了来回的消耗。
时间复杂度:Qsqrt(n)+n*sqrt(n)
1.普通莫队
其实就是普通莫队的模板提
#include <iostream>
#include <cmath>
#include <cstdio>
#include <algorithm>
using namespace std;
typedef long long LL;
const int maxn = 1<<20;
int pos[maxn],n,m;
int bk;
LL cnt[maxn],ans[maxn],tem,a[maxn],k;
struct node{
int l,r,id;
node(){};
node(int l,int r,int id):l(l),r(r),id(id){};
}ask[maxn];
void init(){
bk=sqrt(n);
for(int i = 1; i <= n ; i++){
scanf("%lld",&a[i]);
a[i]^=a[i-1];
pos[i]=(i-1)/bk+1;
}
for(int i = 1 ; i <= m ; i++){
int x,y;scanf("%d%d",&x,&y);
ask[i]=node(x,y,i);
}
sort(ask+1,ask+1