gn1314

莫队模板代码

莫队算法:

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()是根据具体题目进行的操作

posted on 2019-09-01 23:26  gnftau  阅读(132)  评论(0编辑  收藏  举报
 

分类:

技术点:

相关文章:

  • 2021-11-18
  • 2022-01-03
  • 2022-03-02
  • 2021-04-01
  • 2021-10-09
  • 2022-02-25
  • 2022-12-23
  • 2021-12-16
猜你喜欢
  • 2021-10-25
  • 2022-12-23
  • 2021-08-08
  • 2022-01-17
  • 2022-12-23
  • 2022-01-10
相关资源
相似解决方案