莫队模板代码
莫队算法:
1)离线算法。。。
2)存在左右指针 L,R,对于每次询问移动左右指针。。。
3)分块,将1-n分成sqrt(n)块,利用分的块对询问进行排序进行排序。。。
4)对询问进行离线排序,这样就能尽量减少左右指针的移动,从而能够减少时间复杂度。。。
1 //node保存询问的区间、顺序 2 //arr保存1-n的数字数组 3 //cnt记数数组 4 struct node{ 5 int l,r; 6 int id; 7 }ans[Maxn]; 8 bblock = (int)sqrt(n) 9 10 bool cmp(node a,node b){ 11 if(a.l/bblock != b.l/bblock) 12 return a.l/bblock < b.l/bblock; 13 return a.r<b.r; 14 } 15 16 void update(int pos,int n){ 17 int val=arr[pos]; 18 if(n==1) 19 re+=2*cnt[val]+1; 20 else 21 re-=2*cnt[val]+1; 22 cnt[val]+=n; 23 } 24 25 void solve(){ 26 for(int i=1;i<=m;i++){ 27 while(L>ans[i].l) 28 update(--L,1); 29 while(R<ans[i].r) 30 update(++R,1); 31 while(L<ans[i].l) 32 update(L++,-1); 33 while(R>ans[i].r) 34 update(R--,-1); 35 res[node[i].id]=re; 36 } 37 }
bblock 分成的块数量
其中update()是根据具体题目进行的操作